Можно ли glTexImage2d изображение NPOT на текстуру Pow-2 без дополнительного выделения? - PullRequest
0 голосов
/ 22 февраля 2011

Я обнаружил, что до сих пор существует достаточное количество драйверов, которые не поддерживают текстуры NPOT, поэтому я пытаюсь переоснастить свой 2D-движок (основанный на OpenTK, который, в свою очередь, основан на OpenGL) сПоддержка Texture2D вместо того, чтобы полагаться на GL_ARB_texture_rectangle.В рамках этого я заставляю все растровые изображения текстуры NPOTS выделять дополнительное пространство до следующего размера степени 2, чтобы они не вызывали ошибок в этих драйверах.Мой вопрос заключается в том, действительно ли мне нужно изменить размер реального растрового изображения и текстуры и выделить всю эту дополнительную память, или есть ли способ сообщить OpenGL, что мне нужна текстура размером с степень 2, но я только собираюсь использоватьчасть его в верхнем левом углу?

Сейчас мой вызов выглядит так:

GL.TexImage2D(texTarget, 0, PixelInternalFormat.Rgba8, bmpUse.Width, bmpUse.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, bits.Scan0);

Это после того, как я сделал bmpUse копией моего реального текстурного растрового изображения с дополнительным пространствомсправа и снизу.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Используйте glTexImage2D с пустыми данными для инициализации текстуры и glTexSubImage2D для заполнения части ее данными.Технически OpenGL позволяет параметру данных, заданному для glTexImage{1,2,3}D, быть нулевым указателем, указывающим, что объект текстуры просто должен быть инициализирован.Это зависит от языковой привязки, если эта функция поддерживается на целевом языке - просто проверьте, что произойдет, если вы передадите нулевой указатель.

0 голосов
/ 22 февраля 2011

datenwolf прав в том, как инициализировать текстуру только с частичным изображением, но есть две проблемы с этим, о которых вам необходимо знать:

  • вам нужно переназначить координаты текстуры вашей сетки, так как диапазон текстуры [0-1] полной текстуры теперь также содержит неинициализированные данные, в отличие от вашей полной текстуры. Полезный диапазон теперь [0-orig_width/padded_width]
  • Обтекание вашей текстуры обернет только всю текстуру, а не вашу часть.
...