Opengl es 对顶点使用GLshort而不是GLfloat

Opengl es 对顶点使用GLshort而不是GLfloat,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我正在尝试将我的程序从GLfloat转换为GLshort(顶点位置),我不确定如何在着色器中表示这一点。我在着色器中使用了vec3数据类型,但vec3表示3个浮动。现在我需要代表3条短裤。据我所知,OpenGL没有一个用于短裤的向量,那么在这种情况下我应该怎么做呢 我不知道如何在着色器中表示这一点 这是因为该信息不存在于着色器中 glvertexattributepointer提供的所有值都将转换为浮点GLSL值(如果它们还不是浮点值)。这种转换基本上是免费的。因此,您可以将以下任一glvert

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

我不知道如何在着色器中表示这一点

这是因为该信息不存在于着色器中

glvertexattributepointer
提供的所有值都将转换为浮点GLSL值(如果它们还不是浮点值)。这种转换基本上是免费的。因此,您可以将以下任一
glvertexattributepointer
定义与
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
。您的着色器不必知道或关心它是否被馈送了短路、字节、整数、浮点等

第一个将按原样使用。第二个将无符号短程[065535]转换为[0.0,1.0]浮点范围。第三个将有符号短程[-32768,32767]转换为[-1.0,1.0]范围()。第四个将[-3276832767]转换为[-32768.032767.0],作为浮点范围

如果使用
glvertexattributepointer
glvertexattributepointer
,则仅用于属性的GLSL类型会更改,这两种类型在OpenGL ES 2.0中都不可用


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

在阅读了以下地址的答案后,我的印象是:和@Xavier:您没有抓住要点。顶点数据的大小由
glvertexattributepointer
定义,而不是由GLSL属性变量定义。您不需要在着色器中表示较小的组件;硬件将从较小的组件转换为较大的组件。@nicol bolas对于签名数据类型,您确定转换的范围是例如(对于
short
[-32768,32767]
而不是
[-32767,32767]
?据推测,这本书摘自《橘子皮书》,但它的教学方式似乎有所不同。它说转换只是有符号类型的一个划分。在这种情况下,短值
-32768
将转换为浮点GLSL值
-32768/32767=-1.000305185..
。我在规范中找不到确定哪个是正确的地方。@wil:范围是正确的。这根本不是一个线性变换-32768和-32767都产生-1.0。OpenGL规范对此非常清楚。