【问题标题】:Using GLshort instead of GLfloat for vertices对顶点使用 GLshort 而不是 GLfloat
【发布时间】:2012-07-25 14:40:36
【问题描述】:

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

【问题讨论】:

    标签: opengl-es opengl-es-2.0


    【解决方案1】:

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

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

    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],作为浮点范围。

    仅当您使用 glVertexAttribIPointerglVertexAttribLPointer 时,您用于属性的 GLSL 类型才会发生变化,这两种方法在 OpenGL ES 2.0 中均不可用。

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

    【讨论】:

    • 在阅读stackoverflow.com/a/1316494/256062stackoverflow.com/a/5721102/256062 的答案后,我的印象是我可以做到
    • @Xavier:你没有抓住重点。顶点数据的大小由glVertexAttribPointer 定义,不是 GLSL 属性变量。您不需要在着色器中表示较小的组件;硬件将从较小的组件转换到较大的组件。
    • @nicol-bolas 对于带符号的数据类型,您确定转换后的范围是例如 (for short) [-32768, 32767] 而不是 [-32767, 32767] 吗?这个article,据说取自橙皮书,似乎有不同的教法。它说转换只是有符号类型的划分。在这种情况下,短值 -32768 将转换为浮点 GLSL 值 -32768 / 32767 = -1.000305185.. 。我在规范中找不到确定哪个是正确的。
    • @wil:范围是正确的。这根本不是线性变换。 -32768 和 -32767 都产生 -1.0。 OpenGL 规范对此非常清楚。
    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多