使用GLshort而不是GLfloat作为顶点

时间:2012-07-26 22:30:12

标签: opengl-es opengl-es-2.0

我正在尝试将我的程序从GLfloat转换为GLshort以获取顶点位置,我不知道如何在着色器中表示这一点。我在着色器中使用了vec3数据类型,但vec3代表3个浮点数。现在我需要代表3条短裤。据我所知,OpenGL没有短裤的矢量,所以在这种情况下我该怎么做?

1 个答案:

答案 0 :(得分: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]范围(though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0)。第四个将[-32768,32767]转换为[-32768.0,32767.0],作为浮点范围。

仅当您使用glVertexAttribIPointerglVertexAttribLPointer时,用于属性的GLSL类型才会更改,而这两种格式在OpenGL ES 2.0中都不可用。

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