【发布时间】:2019-07-19 07:20:24
【问题描述】:
我想为一个对象存储几种颜色,并能够在运行时从一种颜色切换到另一种颜色。
目前,我以这种方式使用 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 的索引。
着色器对我来说很新,这就是我要求良好做法的原因。
【问题讨论】:
-
“我每次都必须加载我的着色器” - 为什么?根据着色器执行顶点属性规范,但不要为规范链接着色器。那便宜多了。常用Layout Qualifiers指定属性位置
-
我喜欢这种方式,但我不明白如何在运行时更改颜色?我是否必须生成两个顶点着色器,一个用于第一种颜色,一个用于第二种颜色?然后我将这些着色器“glAttachShader”到两个不同的程序并切换程序以更改颜色?
-
不,一个着色器程序!使用 2 个不同的 Vertex Array Object(或在运行时调用
glVertexAttribPointer) -
你能用这样的着色器使用两个不同的顶点数组对象发布答案吗?我很难理解该怎么做。