GLSL传递整数顶点属性

时间:2016-08-26 18:19:02

标签: c++ opengl-es glsl webgl

我正在使用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错误1282(无效操作)

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

1 个答案:

答案 0 :(得分:1)

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

来自规范2.8节

  

enter image description here   表2.4列出了尺寸和尺寸的允许值   类型。要键入值BYTEUNSIGNED_BYTESHORTUNSIGNED_SHORTFIXEDFLOAT,请指明类型byte,{分别为{1}},ubyteshortushortfixed

WebGL

不支持

float

Floats和Ints的大小相同(32位)和floats can represent ints up to 16 million with no loss of precision,所以除非你需要值> 1600万你可以使用花车

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

您可能还需要考虑将纹理存储在纹理中,这样就不会像many devices probably have a lot fewer uniforms than your PC

那样耗尽制服。

How do you do skinning in WebGL