发送规范化顶点属性会产生垃圾
Sending normalized vertex attribute produces garbage
我正在尝试发送一个颜色属性到我的GLSL着色器。
颜色存储在紧密封装的字节数组中,由3个连续字节组成RGB三元组。着色器期望vec3
,所以我调用glVertexAttribPointer
发送标准化浮点值到着色器。
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glBufferData(GL_ARRAY_BUFFER, mesh.n_vertices() * 3 * sizeof(GLubyte), color, GL_STATIC_DRAW);
// a little later
glEnableVertexAttribArray(attributes[COLOR]);
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glVertexAttribPointer(attributes[COLOR], 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
结果是:
- 颜色似乎没有到达着色器,顶点的颜色是单一的绿色
- 应用程序的性能受到严重影响
当我手动规范化颜色值时,将它们复制到浮点数组并将其发送给OpenGL,它渲染没有任何问题:
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glBufferData(GL_ARRAY_BUFFER, mesh.n_vertices() * 3 * sizeof(GLfloat), colorf, GL_STATIC_DRAW);
// a little later
glEnableVertexAttribArray(attributes[COLOR]);
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]);
glVertexAttribPointer(attributes[COLOR], 3, GL_FLOAT, GL_FALSE, 0, 0);
我在AMD显卡和opengl3.0环境下测试了这个。
为什么会发生这种情况?我错过什么了吗?
根据Bahbar的建议,我现在将颜色三元组对齐到32位,它完美地工作。颜色在着色器中正确到达,并且没有任何性能影响。
相关文章:
- 如何导出包含具有"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++ 命名参数习惯用语 - 未设置字符串属性
- 发送规范化顶点属性会产生垃圾