OpenGL Luminance внутренний тип данных
Я создаю 2D-текстуру, и меня смущает тип данных, в котором на самом деле хранится моя текстура. Мой ввод - это двумерный 32-битный массив с плавающей запятой, который пока нормализован до 0-1. Я создаю текстуру с помощью вызова, похожего на это:
glTexImage2D(self._target, 0, GL_LUMINANCE, GL_LUMINANCE, gl.GL_UNSIGNED_BYTE, (2048, 8192))
И отправка данных с чем-то похожим на это:
glTexSubImage2D(self._target, 0, x, y, GL_LUMINANCE, GL_FLOAT, data)
Я понимаю, что, поскольку я использую яркость, данные ограничиваются значениями от 0 до 1 в виде числа с плавающей точкой (поэтому я их нормализую) и доступны в GLSL для меня как vec4 (L, L, L, 1). Но какой тип данных на самом деле используется для хранения этого числа? Хранится ли он как один 32-разрядный код с плавающей точкой, а затем делает его похожим на vec4 в GLSL?
Я спрашиваю, потому что, если бы я переключился на GL_R32F или что-то подобное, моя текстура заняла бы то же количество видеопамяти, что и яркость? Есть ли способ не ограничивать данные яркости от 0 до 1. И есть ли другой способ, кроме добавления альфа-канала для заполнения значений (значения, которые указывают, что тексель не должен отображаться, например, NaN или -9999.0 или что-то в этом роде))?
Спасибо за любую помощь. Я использую пакет pypy vispy, который упаковывает pyopengl.
0 ответов
Интересно, что с тех пор, как я изначально задал этот вопрос, я не стал сопровождающим библиотеки vispy. Вот ответ на мой собственный вопрос, чтобы закрыть это. Большая часть ответа исходит отсюда, и изначально на нее ответили в комментариях:
https://www.khronos.org/opengl/wiki/Image_Format
В текстуре вы можете указать тип, который является нормализованным беззнаковым или знаковым целым числом, с плавающей запятой, или знаковым или беззнаковым целым числом (без нормализации). Нормализованные типы будут принимать любые данные, которые вы им даете, и нормализовать их до 0-1 в зависимости от типа данных этих данных. Поэтому, если вы дадите ему данные uint8, он будет разделен на 255. Если вы дадите ему uint16, он будет разделен на 65535. Независимо от типа вы увидите в шейдере числа с плавающей запятой 0-1. Другие ненормализованные типы (числа с плавающей запятой, знаковые / беззнаковые ненормализованные целые числа) будут в исходном диапазоне.