[英]GLSL Passing integer vertex attribute
我正在使用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顶点属性传递给glsl的示例?
WebGL 1.0和GLSL ES 1.0X不支持将GL_INT传递给顶点着色器。
从规范第2.8节开始
表2.4列出了大小和类型的允许值。 对于类型,值
BYTE
,UNSIGNED_BYTE
,SHORT
,UNSIGNED_SHORT
,FIXED
和FLOAT
指示类型byte
,ubyte
,short
,ushort
,fixed
和float
。
WebGL不支持FIXED
浮点数和整数大小相同(32位),并且浮点数最多可以表示1600万个整数,而不会损失精度,因此,除非需要的值大于1600万,否则可以只使用浮点数
否则,在您的示例中,您只能访问64个骨骼。 为什么不只使用UNSIGNED_BYTE
或UNSIGNED_SHORT
?
您可能还需要考虑将骨骼矩阵存储在纹理中,这样您就不会用完制服,因为许多设备的制服可能比您的PC少得多
看到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.