Использование GLshort вместо GLfloat для вершин
Я пытаюсь преобразовать свою программу из GLfloat в GLshort для позиций вершин, и я не уверен, как представить это в шейдере. Я использовал тип данных vec3 в шейдере, но vec3 представляет 3 числа с плавающей запятой. Теперь мне нужно представить 3 шорта. Насколько я могу судить, у OpenGL нет вектора для шортов, так что мне делать в этом случае?
1 ответ
Я не уверен, как представить это в шейдере.
Это потому, что эта информация не живет в шейдере.
Все значения предоставлены glVertexAttribPointer
будет преобразован в значения GLSL с плавающей точкой (если они уже не являются плавающими). Это преобразование по существу бесплатно. Таким образом, вы можете использовать любой из этих glVertexAttribPointer
определения с vec4
тип атрибута:
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...);
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...);
Все они будут преобразованы в vec4
автоматически Ваш шейдер не должен знать или заботиться о том, что он получает шорты, байты, целые числа, числа с плавающей точкой и т. Д.
Первый будет использоваться как есть. Второй преобразует короткий диапазон без знака [0, 65535] в диапазон с плавающей запятой [0.0, 1.0]. Третий преобразует подписанный короткий диапазон [-32768, 32767] в диапазон [-1.0, 1.0] ( хотя преобразование немного нечетное и отличается для некоторых версий OpenGL, чтобы целое число 0 отображалось в плавающее пункт 0.0). Четвертый преобразует [-32768, 32767] в [-32768.0, 32767.0] как диапазон с плавающей запятой.
Тип GLSL, который вы используете для атрибутов, изменяется только при использовании glVertexAttribIPointer
или же glVertexAttribLPointer
Ни один из которых не доступен в OpenGL ES 2.0.
Вкратце: вы всегда должны использовать типы GLSL с плавающей точкой для атрибутов. OpenGL сделает преобразование за вас.