存储几种颜色并从一种颜色切换到另一种颜色

时间:2019-07-19 07:20:24

标签: c++ opengl

我想为一个对象存储几种颜色,并能够在运行时从一种颜色切换为另一种颜色。

现在,我以这种方式使用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 个答案:

答案 0 :(得分:3)

我建议生成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(...);

答案 1 :(得分:2)

最好改变颜色属性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)));
}