我使用openglEs 2.0。我正在研究硬件蒙皮。我尝试传递骨骼索引作为ivec4,但编译器告诉我,不可能使用ivec4作为顶点属性。我怎样才能克服这种困惑?ivec4作为顶点属性Opengl ES 2.0
这里是我的顶点着色器的代码。
0(1) : error C7507: OpenGL does not allow attributes of type ivec4
"struct Bone"
"{"
" mat4 transform;"
" mat4 bindPose;"
"};"
"attribute vec3 vPosition;"
"attribute vec3 vNormal;"
"attribute vec2 vTexture;"
"attribute ivec4 vBones;"
"attribute vec4 vWeights;"
"uniform mat4 projectViewModel;"
"uniform Bone bones[64];"
"varying vec3 v_normal;"
"varying vec2 v_texCoord;"
"void main()"
"{"
" gl_Position = bones[vBones.x].transform * bones[vBones.x].bindPose * vec4(vPosition, 1.0) * vWeights.x;"
" gl_Position += bones[vBones.y].transform * bones[vBones.y].bindPose * vec4(vPosition, 1.0) * vWeights.y;"
" gl_Position += bones[vBones.z].transform * bones[vBones.z].bindPose * vec4(vPosition, 1.0) * vWeights.z;"
" gl_Position += bones[vBones.w].transform * bones[vBones.w].bindPose * vec4(vPosition, 1.0) * vWeights.w;"
" gl_Position = projectViewModel * gl_Position;"
" v_texCoord = vTexture;"
" v_normal = vNormal;"
"}";
UPDATE:
正如有人告诉我,我改变了shader代码和客户端代码。下面是客户端代码:
glEnableVertexAttribArray(3); // Bones
glVertexAttribPointer(3, 4, GL_INT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
这就是我如何访问到骨指数在着色器代码:
gl_Position = bones[int(vBones.x)].transform * bones[int(vBones.x)].bindPose * vec4(vPosition, 1.0) * vWeights.x;
如果我上运行的Windows PC的代码。它工作得很好,但是当我用emscripten编译到Web浏览器。它给出了gl错误1282(无效操作)。
如果我改变GL_FLOAT然而,这修复GL错误,所有的骨指数为0,我得到一个没有皮肤的网状因为骨0有单位矩阵作为bindpose和worldpose矩阵。
我正在使用glVertexAttribIPointer绑定顶点属性。我从ivec4更改为vec4,并将索引从float转换为int。我相信这是安全的,因为骨指数介于0和64之间。 – Cihan