Opengl ES 2.0的顶点属性为ivec4
ivec4 as vertex attribute Opengl ES 2.0
我使用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
)。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++ 在堆栈中包含多态属性的类对象存储
- C++ 命名参数习惯用语 - 未设置字符串属性
- Opengl ES 2.0的顶点属性为ivec4