2016-08-14 167 views
-1

我使用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矩阵。

+0

我正在使用glVertexAttribIPointer绑定顶点属性。我从ivec4更改为vec4,并将索引从float转换为int。我相信这是安全的,因为骨指数介于0和64之间。 – Cihan

回答

1

整型属性不是在ES 2.0支持。从GLSL ES 1.00规范(其与ES 2.0中使用的GLSL版本):

属性限定词可以与数据类型浮动,VEC2,VEC3,vec4,MAT2,MAT3和MAT4仅使用。

您可以做的最接近的是在着色器代码中使用vec4,并在需要时将浮点值转换为整数。

如果您的客户端上的数据是整数格式,你必须要小心你glVertexAttribPointer()电话。作为第四个参数传递的布尔值指定是否要对值进行规范化,或者是否应将其转换为未进行规范化的float。在你的情况下,你会想通过GL_FALSE。例如,如果您的客户端代码中包含字节数据:

glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0); 

ES 3.0及更高版本支持整数属性。因此,您可以使用ivec4作为属性,并在您的客户端代码中使用glVertexAttribIPointer()(注意函数名称中的其他I)指定值。