Использование 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 сделает преобразование за вас.

Другие вопросы по тегам