存储多种颜色并从一种颜色切换到另一种颜色
Store several colors and switch from one color to another
我想为一个对象存储几种颜色,并能够在运行时从一种颜色切换到另一种颜色。
现在,我使用 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 个不同的顶点数组对象。
你已在着色器程序中具有以下属性位置:
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(...);
你最好简单地更改颜色属性 1 的属性绑定点(这比每次重新编译着色器要容易得多!
if(renderingUsingColor1)
{
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (_verticesBytesSize)));
}
else
{
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, ((char*)NULL + (_verticesBytesSize) + (_colorsBytesSize)));
}
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 存储多种颜色并从一种颜色切换到另一种颜色
- OpenCV将一种颜色转换为任何其他颜色
- 从一种颜色插值到另一种颜色
- C++图像库 - 找到一种颜色的像素并使它们变白,其他一切都变黑
- OpenCV将一种颜色转换为另一种颜色
- C++:有没有一种简单的方法可以将十六进制颜色"0xff2a2620""映射到更具可读性的字符串"lovelyBrown"?
- 如何在顶点缓冲区中以另一种颜色绘制顶点
- Qt GLSL纹理仅显示一种颜色
- 从一种颜色到另一种颜色的插值