6

I'm attempting to convert my program from GLfloat to GLshort for vertex positions and I'm not sure how to represent this in the shader. I was using a vec3 datatype in the shader but vec3 represents 3 floats. Now I need to represent 3 shorts. As far as I can tell OpenGL doesn't have a vector for shorts so what am I supposed to do in this case?

4

1 回答 1

16

我不确定如何在着色器中表示它。

那是因为这些信息并不存在于着色器中。

提供的所有值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 类型只有在您使用glVertexAttribIPointeror时才会发生变化glVertexAttribLPointer,这在 OpenGL ES 2.0 中都不可用。

简而言之:您应该始终对属性使用浮点 GLSL 类型。OpenGL 将为您进行转换。

于 2012-07-26T22:33:38.640 回答