c++ - 存储多种颜色并从一种颜色切换到另一种颜色
问题描述
我想为一个对象存储几种颜色,并能够在运行时从一种颜色切换到另一种颜色。
现在,我以这种方式使用 VBO 和 VAO 存储顶点和颜色:
glBufferSubData(GL_ARRAY_BUFFER, 0, _verticesBytesSize, _vertices.data());
glBufferSubData(GL_ARRAY_BUFFER, _verticesBytesSize, _colorsBytesSize, _colors1.data());
glBufferSubData(GL_ARRAY_BUFFER, _verticesBytesSize+_colorsBytesSize, _colorsBytesSize, _colors2.data());
我为这些数据数组中的每一个创建“glVertexAttribPointer”。顶点索引 0 和颜色索引 1 和 2 :
...
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (0)));
...
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (_verticesBytesSize)));
...
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (_verticesBytesSize) + (_colorsBytesSize)));
在着色器加载函数(管理编译、着色器和程序关联等)中,我使用“glBindAttribLocation”来指定着色器/程序的条目:
glBindAttribLocation(_program, 0, "in_Vertex");
glBindAttribLocation(_program, 1, "in_Color");
如果我使用索引 1,“in_Color”将为 color1,而如果我使用索引 2,“in_Color”将为 color2。
它工作正常。我的问题是:这是最好的方法吗?我的意思是,每次我想更改颜色时,我都必须加载我的着色器,为加载着色器函数提供要使用的 glVertexAttribPointer 的索引。
着色器对我来说很新,这就是我要求良好实践的原因。
解决方案
我建议生成 2 个不同的Vertex Array Object。
您已使用具有以下属性位置的着色器程序:
glBindAttribLocation(_program, 0, "in_Vertex"); glBindAttribLocation(_program, 1, "in_Color");
在缓冲区:
glBufferSubData(GL_ARRAY_BUFFER, 0, _verticesBytesSize, _vertices.data()); glBufferSubData(GL_ARRAY_BUFFER, _verticesBytesSize, _colorsBytesSize, _colors1.data()); glBufferSubData(GL_ARRAY_BUFFER, _verticesBytesSize+_colorsBytesSize, _colorsBytesSize, _colors2.data());
创建 2 个顶点数组对象。两者都将颜色与属性索引 1 相关联,但它们使用不同的缓冲区偏移量:
GLuint vao[2];
glGenVertexArrays(2, &vao);
glBindVertexArray(vao[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (0)));
int offset = _verticesBytesSize;
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + offset ));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindVertexArray(vao[1]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (0)));
int offset = _verticesBytesSize + _colorsBytesSize;
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + offset));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);
绘制网格时绑定正确的顶点数组对象。以下i
是 0 或 1:
glBindVertexArray( vao[i] );
glDrawArrays(...);
推荐阅读
- recursion - MIPS Hermite 堆栈示例使用
- c# - 在 ubuntu 上通过 .net 核心发送电子邮件返回 base64 错误
- node.js - 我在提供或部署 Firebase 托管功能时遇到问题
- react-native - 为什么我的 onEnter 道具没有被触发?(react-native-router-flux v4)
- android - 调用lifecycle.addObserver 后出现内存泄漏
- r - 在数据框中的组内按时间向后编号代数(gen:0、-1、-2 等)
- javascript - Azure Maps 上是否有任何绘图功能?
- c# - 如何在 LINQ 中将行转换为列
- elasticsearch - ElasticSearch 有什么好的布尔查询解析器吗?
- c++ - 通过索引运算符插入 boost::program_options::variables_map