Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ivec4作为顶点属性Opengl ES 2.0_C++_Opengl Es_Emscripten_Glsles - Fatal编程技术网

C++ ivec4作为顶点属性Opengl ES 2.0

C++ ivec4作为顶点属性Opengl ES 2.0,c++,opengl-es,emscripten,glsles,C++,Opengl Es,Emscripten,Glsles,我使用openglEs 2.0。我正在进行硬件蒙皮。我尝试将骨骼索引作为ivec4传递,但编译器告诉我,不可能将ivec4用作顶点属性。我怎样才能克服这个问题 这是我的顶点着色器代码 0(1) : error C7507: OpenGL does not allow attributes of type ivec4 "struct Bone" "{" " mat4 transform;" " mat4 bindPose;" "};" "attrib

我使用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上运行这段代码,它工作得很好,但是当我用emscripten编译到web浏览器时。它给出gl error 1282无效操作


如果我更改为GL_FLOAT,这将修复GL错误,但是,所有骨骼索引将变为0,并且我将获得一个无蒙皮网格,因为骨骼0具有单位矩阵作为bindpose和worldpose矩阵。

ES 2.0不支持整数属性。根据与ES 2.0一起使用的GLSL版本GLSL ES 1.00规范:

属性限定符只能与数据类型float、vec2、vec3、vec4、mat2、mat3和mat4一起使用

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

如果客户端上的数据是整数格式,则必须小心glvertexattributepointer调用。作为第4个参数传递的布尔值指定是要对值进行规格化,还是应在不进行规格化的情况下将值转换为浮点值。在您的情况下,您将希望通过GL_FALSE。例如,如果客户端代码中有字节数据:

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

ES 3.0及更高版本支持整数属性。因此,您可以将ivec4用于属性,并使用glVertexAttribIPointer指定值。请注意,在客户端代码中的函数名中添加了I。

ES 2.0不支持整数属性。根据与ES 2.0一起使用的GLSL版本GLSL ES 1.00规范:

属性限定符只能与数据类型float、vec2、vec3、vec4、mat2、mat3和mat4一起使用

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

如果客户端上的数据是整数格式,则必须小心glvertexattributepointer调用。作为第4个参数传递的布尔值指定是要对值进行规格化,还是应在不进行规格化的情况下将值转换为浮点值。在您的情况下,您将希望通过GL_FALSE。例如,如果客户端代码中有字节数据:

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

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

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