Использование TEXTURE_RECTANGLE_ARB, влияющее на TEXTURE_2D - PullRequest
1 голос
/ 29 июля 2011

Я использую OpenGL 1.3 для выполнения 2D-рендеринга спрайтов и поддерживаю текстуры POTS (степень двух размеров) и текстуры NPOTS (не степени двух размеров) с TEXTURE_2D и TEXTURE_RECTANGLE_ARB соответственно.

Я начал сТекстуры POTS (с использованием TEXTURE_2D), которые работали нормально, но теперь я добавляю текстуры NPOTS (используя TEXTURE_RECTANGLE_ARB).Это добавление привело к разрыву текстур POTS (с TEXTURE_2D).

Под разрывом я подразумеваю, что текстуры POTS отображаются в виде градаций серого в диапазоне от серого в нижнем левом углу и белого в верхнем правом.

Дополнительная точка (обнаруженная при попытке исправить эту ошибку). Одно из существенных различий между TEXTURE_RECTANGLE_ARB и TEXTURE_2D заключается в том, что первый использует ненормализованные координаты текстур, тогда как TEXTURE_2D использует нормализованные координаты ([0.0,1.0]),Я решил проверить и заменить нормализованные координаты TEXTURE_2D ненормализованными координатами, и это устранило проблему оттенков серого, создав другую - это рендеринг неправильной текстуры!

Т.е. при использовании текстуры POTS и NPOTS моя текстура POTS пытается визуализировать текстуру NPOTS.

Кто-нибудь знает, почему это может происходить?Thankyou!

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Даже если вы решили свою проблему, я хотел бы уточнить концепцию, которая может решить проблемы, которые могут возникнуть в ближайшем будущем.

Вот что не так:

Теперь я добавляю текстуры NPOTS (используя TEXTURE_RECTANGLE_ARB)

GL_texture_rectangle Расширение OpenGL не означает поддержку текстур Not Power Of Two (NPOT); правильное расширение OpenGL для запроса - GL_texture_non_power_of_two.

GL_texture_non_power_of_two не может сломать существующие приложения, которые ожидают текстуру Power Of Two (POT), потому что это ослабляет спецификацию, чтобы принимать текстуры, имеющие любую ширину / высоту / глубину (в определенных пределах, конечно). Вот цитата расширения:

Нет никаких дополнительных процедурных или перечисляемых API, введенных этим расширение, за исключением того, что реализация, которая экспортирует расширение строка позволит приложению передавать размеры текстуры для 1D, 2D, карта куба и 3D цели, которые могут быть или не быть степенью из двух.

Вместо этого GL_texture_rectangle позволяет вам задавать координаты текстуры, обращаясь к экстентам текстуры (ширине и высоте) с помощью координаты пикселя, которая является целым числом (вместо обычной координаты с плавающей запятой, нормализованной в диапазоне [0.0f, 1.0f] ). Кроме того, текстуры прямоугольника не могут поддерживать мипмаппирование.


Кроме того, если вы прочитали спецификацию GL_texture_rectangle, она не предназначена для поддержки текстуры NPOT, потому что на текстуры прямоугольника должны влиять те же ограничения 2D-текстур.

1 голос
/ 29 июля 2011

Хорошо, получается, что это была довольно глупая ошибка, обнаруженная в исходном коде TEXTURE_2D. Я забыл завершить рендеринг с правильным glDisable!

т.е. код рендеринга начинался с glEnable (targetType), но не заканчивался glDisable (targetType) [где targetType был правильным выбором GL_TEXTURE_2D или GL_TEXTURE_RECTANGLE_ARB].

Полагаю, как-то две среды рендеринга переплелись.

Урок - убедитесь, что когда вы начинаете с glEnable, вы заканчиваете с glDisable.

Редактировать: Учитывая приведенный ниже комментарий, я немного покопался и узнал о целевом президентстве. Идея представлена ​​в начале этой статьи:

http://math.hws.edu/graphicsnotes/c4/s5.html

"При визуализации поверхности будет использоваться не более одной текстурной цели. Если включено несколько целей, 3D-текстуры имеют приоритет над 2D-текстурами, а 2D-текстуры имеют приоритет над 1D. За исключением одного примера далее в этом разделе, мы будет работать только с 2D текстурами. "

С точки зрения приоритета TEXTURE_RECTANGLE_ARB, это описано в спецификации в разделе 10: http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt

Я не знал о целевом приоритете или приоритетах во время ошибки, так что спасибо @datenwolf!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...