使用GLshort而不是GLfloat作为顶点

Xav*_*ier 6 opengl-es opengl-es-2.0

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

Nic*_*las 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, ...);
Run Code Online (Sandbox Code Playgroud)

所有这些都将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中都不可用.

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