【问题标题】:GLSL Passing integer vertex attributeGLSL传递整数顶点属性
【发布时间】:2016-08-27 03:45:44
【问题描述】:

我正在使用 opengles 2.0。我正在尝试将整数值传递给顶点着色器。我的客户端代码是这样的:

glEnableVertexAttribArray(3); // Bones
glVertexAttribPointer(3, 4, GL_UNSIGNED_SHORT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);

而顶点着色器代码是:

attribute vec4 vBones;
uniform Bone bones[64];
gl_Position = bones[int(vBones.x)].transform * bones[int(vBones.x)].bindPose * vec4(vPosition, 1.0) * vWeights.x;

如果我按原样编译代码。所有“vBones.xyzw”都变为 0,我得到一个未蒙皮的网格。因为 0 指的是单位矩阵。

如果我将客户端代码更改为此:

glVertexAttribPointer(3, 4, GL_INT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);

代码在 Windows 中运行没有任何错误。但是,当我通过 emscripten 将其编译为 webgl 时,我得到 gl error 1282 (Invalid Operation)

简单地说,你能给我一个将 int 顶点属性传递给 glsl 的例子吗?

【问题讨论】:

  • GL_INT 不在有效参数列表中。来源:khronos.org/opengles/sdk/docs/man/xhtml/…
  • 是的,但它在 Windows 中工作得很好:)
  • 因为你很可能没有在 windows 上运行 OpenGL ES。
  • 我正在使用 sdl 来设置 opengl 版本。我不知道 sdl 是做什么的。但我向你保证,我将其正确设置为 opengl es 2.0 版。因为否则 emscripten 会失败。
  • 即使它可以在 Windows 上运行,也不必在其他任何地方运行。 GL_INT 不在此函数的规范中,任何实现 OpenGL ES 2.0 驱动程序的人都不必处理它。您需要将GL_UNSIGNED_SHORTGL_SHORT 的数组传递给函数。

标签: c++ opengl-es glsl webgl


【解决方案1】:

WebGL 1.0 和 GLSL ES 1.0X 不支持将 GL_INT 传递给顶点着色器。

来自规范第 2.8 节

表 2.4 显示了尺寸的允许值和 类型。对于类型值BYTEUNSIGNED_BYTESHORTUNSIGNED_SHORTFIXEDFLOAT,表示类型byteubyteshortfixed4、和float,分别

FIXED 在 WebGL 中不受支持

浮点数和整数是相同的大小(32 位)和floats can represent ints up to 16 million with no loss of precision,所以除非您需要大于 1600 万的值,否则您可以使用浮点数

否则,在您的示例中,您将访问骨骼,而您只有 64 个骨骼。为什么不直接使用UNSIGNED_BYTEUNSIGNED_SHORT

您可能还想考虑将骨骼矩阵存储在纹理中,这样您就不会像many devices probably have a lot fewer uniforms than your PC那样用完制服

How do you do skinning in WebGL

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多