繁体   English   中英

GLSL传递整数顶点属性

[英]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列出了大小和类型的允许值。 对于类型,值BYTEUNSIGNED_BYTESHORTUNSIGNED_SHORTFIXEDFLOAT指示类型byteubyteshortushortfixedfloat

WebGL不支持FIXED

浮点数整数大小相同(32位),并且浮点数最多可以表示1600万个整数,而不会损失精度,因此,除非需要的值大于1600万,否则可以只使用浮点数

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

您可能还需要考虑将骨骼矩阵存储在纹理中,这样您就不会用完制服,因为许多设备的制服可能比您的PC少得多

看到

您如何在WebGL中做皮肤

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM