我正在使用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的例子吗?
答案 0 :(得分:1)
WebGL 1.0和GLSL ES 1.0X不支持将GL_INT传递给顶点着色器。
来自规范2.8节
WebGL 不支持表2.4列出了尺寸和尺寸的允许值 类型。要键入值
BYTE
,UNSIGNED_BYTE
,SHORT
,UNSIGNED_SHORT
,FIXED
和FLOAT
,请指明类型byte
,{分别为{1}},ubyte
,short
,ushort
和fixed
float
Floats和Ints的大小相同(32位)和floats can represent ints up to 16 million with no loss of precision,所以除非你需要值> 1600万你可以使用花车
否则,在您的示例中,您访问的骨骼只有64个骨骼。为什么不使用FIXED
或UNSIGNED_BYTE
?
您可能还需要考虑将纹理存储在纹理中,这样就不会像many devices probably have a lot fewer uniforms than your PC
那样耗尽制服。见