Отображение произвольного размера 2d изображения в OpenGL
Вопрос
Мне нужно отобразить 2D-изображения в OpenGL с использованием текстур.
Размеры изображения не обязательно должны быть степенями 2.
Я думал о создании текстуры большего размера и ограничении отображения той частью, которую я использовал, но данные изображения будут передаваться в openCV, поэтому я не хочу копировать данные по пикселю за раз в большую текстуру.
РЕДАКТИРОВАТЬ - оказывается, что даже самая простая встроенная графическая карта Intel под Windows поддерживает текстуры без мощности 2.
РЕДАКТИРОВАТЬ2 - и даже если у вас нет размера текстуры arb, то при уменьшении изображения и изменении его размера до размера окна это происходит очень быстро даже на низкоуровневом оборудовании
Решение
На ум приходит пара расширений GL. Взгляните на GL_ARB_texture_rectangle (если вам не нужно отображать карты) или GL_ARB_texture_non_power_of_two (если вы это сделаете).
Другие советы
Единственный недостаток, который следует избегать, заключается в том, что по некоторым причинам некоторые видеокарты требуют, чтобы для GL_UNPACK_ALIGNMENT было установлено значение 1 (glPixelStorei (GL_UNPACK_ALIGNMENT, 1);) для правильной загрузки текстуры не-степени двух.
Если я смогу просто добавить кого-нибудь, кто сталкивался с этим в будущем, то большая часть документации и учебных пособий / примеров, которые вы найдете в Интернете об OpenGL, устарела на много лет, включая материал nehe.gamedev, и приведет вас полагать, что такие вещи, как размеры текстур не в степени двойственности, являются проблемой, когда они реально отсутствуют, или поощрять вас использовать давно устаревшие функции opengl или библиотеки, которые не обновлялись в течение десятилетия. р>
Во-первых, большинство современных видеокарт на самом деле поддерживают размеры текстур, которые не являются квадратными и имеют размер не степени двух. Но для максимальной совместимости рекомендуется использовать только мощность двух текстур.
Начните с определения ближайшей степени двойки, которая больше для каждого из размеров изображения (ширина и высота), и создания текстуры такого размера. Тогда у вас есть два варианта. Первый заключается в том, чтобы программно изменить размер пиксельных данных, чтобы они соответствовали изображению, а затем измерить размер квадратора в соответствии с исходным соотношением сторон, когда вам нужно его отобразить. Или вы можете просто заполнить часть текстуры данными вашего изображения и поместить прозрачные пиксели в остальные.
Если вы хотите использовать мощность двух текстур, создайте наименьшую, которая может занять ваше изображение, и вычислите правильные координаты текстуры, чтобы отобразить только ту часть текстуры, которая содержит ваше изображение. Например. если ваше изображение размером 400x300, вы бы использовали текстуру 512x512, копировали изображение там построчно, и ваша правая координата текстуры была бы 400.0 / 512.0, нижняя 300.0 / 512.0. Это будет выглядеть лучше, чем программное масштабирование.
Я делаю в точности так, как вы описываете, копирую в текстуру степени 2 и соответствующим образом корректирую свои уф. Расширения были бы хорошими, но вы не гарантированы, что они поддерживаются на произвольном компьютере.