16-битная текстура с нечетной шириной - PullRequest
2 голосов
/ 17 февраля 2020

Я загружаю текстуру 35 x 100 16bpp со следующей командой OpenGL:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, 35, 100, 0, GL_RG, GL_UNSIGNED_BYTE, pixelData);

Но полученная текстура отклоняется на один пиксель влево при увеличении y (как при рисовании, так и при проверке в память графического процессора):

o o x o o               o o o x o
o o x o o               o o o o x
o o x o o               x o o o o
o o x o o               o x o o o
o o x o o  becomes->    o o x o o

Этот тип разделения может возникнуть, если указанная ширина отличается от pixelData на один пиксель, но буфер и заданные размеры являются точными. Изменение текстуры на 36 x 100 без каких-либо других изменений также решает проблему. Это происходит ТОЛЬКО для текстур с нечетным числом по ширине.

Мой вопрос: это ошибка драйвера? Насколько я понимаю, не-POT-текстуры были разрешены на современном оборудовании, но это наводит на мысль, что все еще существует какое-то необъявленное требование выравнивания, возможно, указывающее c для 16bpp текстур; нигде я не могу найти упоминания об этом поведении или требованиях.

1 Ответ

1 голос
/ 17 февраля 2020

Текстуры имеют выравнивание, которое они должны встретить в конце каждой строки развертки (горизонтальный ряд), обычно по умолчанию 4 байта. Если это выравнивание не выполнено, текстура будет нуждаться в заполнении в тех местах, которые вы сами должны указать в загруженных пиксельных данных. Обычно это не проблема, пока вы не смешаете размеры текстур не-pow2 с данными текстуры менее 32 бит на пиксель.

Использование glPixelStorei() может настроить это требование для выравнивания 2 или 1, если необходимо, или вы можете просто обеспечить выравнивание размеров текстур кратным 4 при работе с 16-битными текстурами.

...