【发布时间】:2012-07-25 14:40:36
【问题描述】:
我正在尝试将我的程序从 GLfloat 转换为 GLshort 以获得顶点位置,但我不确定如何在着色器中表示它。我在着色器中使用了 vec3 数据类型,但 vec3 代表 3 个浮点数。现在我需要代表 3 条短裤。据我所知,OpenGL 没有用于短裤的向量,那么在这种情况下我应该怎么做?
【问题讨论】:
我正在尝试将我的程序从 GLfloat 转换为 GLshort 以获得顶点位置,但我不确定如何在着色器中表示它。我在着色器中使用了 vec3 数据类型,但 vec3 代表 3 个浮点数。现在我需要代表 3 条短裤。据我所知,OpenGL 没有用于短裤的向量,那么在这种情况下我应该怎么做?
【问题讨论】:
我不确定如何在着色器中表示它。
这是因为这些信息并不存在于着色器中。
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@em>。您的着色器不必知道或关心它正在被输入short、字节、整数、浮点数等。
第一个将按原样使用。第二个将无符号短范围 [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],作为浮点范围。
仅当您使用 glVertexAttribIPointer 或 glVertexAttribLPointer 时,您用于属性的 GLSL 类型才会发生变化,这两种方法在 OpenGL ES 2.0 中均不可用。
简而言之:您应该始终对属性使用浮点 GLSL 类型。 OpenGL 将为您完成转换。
【讨论】:
glVertexAttribPointer 定义,不是 GLSL 属性变量。您不需要在着色器中表示较小的组件;硬件将从较小的组件转换到较大的组件。
short) [-32768, 32767] 而不是 [-32767, 32767] 吗?这个article,据说取自橙皮书,似乎有不同的教法。它说转换只是有符号类型的划分。在这种情况下,短值 -32768 将转换为浮点 GLSL 值 -32768 / 32767 = -1.000305185.. 。我在规范中找不到确定哪个是正确的。