Opengl ES 2.0的顶点属性为ivec4

ivec4 as vertex attribute Opengl ES 2.0

本文关键字:属性 ivec4 顶点 ES Opengl      更新时间:2023-10-16

我使用openglEs 2.0。我正在做硬件蒙皮。我试图通过骨索引作为ivec4,但编译器告诉我,这是不可能使用ivec4作为顶点属性。我怎样才能克服这种情况呢?

这是我的顶点着色器代码。
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;"
    "}";
更新:

正如我被告知的,我改变了着色器代码和客户端代码。下面是客户端代码:

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上运行此代码。它工作得很好,但是,当我编译它与web浏览器的铭文。它给出gl错误1282(无效操作)。

如果我改变到GL_FLOAT这修复了gl错误,然而,所有骨指数变成0,我得到一个无皮肤的网格,因为骨0有单位矩阵作为bindpose和worldpose矩阵。

ES 2.0不支持整数属性。来自GLSL ES 1.00规范(这是与ES 2.0一起使用的GLSL版本):

属性限定符只能用于数据类型float、vec2、vec3、vec4、mat2、mat3和mat4。

你能做的最接近的是在着色器代码中使用vec4,并在需要的地方将浮点值转换为整数。

如果客户端的数据是整数格式,则必须小心glVertexAttribPointer()调用。作为第四个参数传递的布尔值指定您是否希望将值规范化,或者是否应该将它们转换为不规范化的浮点数。在你的情况下,你会想通过GL_FALSE。例如,如果客户端代码中有字节数据:

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

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