Отображение произвольного размера 2d изображения в OpenGL

StackOverflow https://stackoverflow.com/questions/318194

  •  11-07-2019
  •  | 
  •  

Вопрос

Мне нужно отобразить 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 и соответствующим образом корректирую свои уф. Расширения были бы хорошими, но вы не гарантированы, что они поддерживаются на произвольном компьютере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top