据我了解,glDrawArraysInstanced()将绘制一个VBO n 次。 glVertexAttribDivisor()使用1,这样每个实例在着色器中都有一个唯一的属性。到目前为止,我可以使用 vec4 *实例为每个实例传递不同的颜色,并且该实例中的每个顶点将共享该属性,因此三角形的每个实例都具有不同的颜色。
然而,我正在寻找的是一种除数,它将为每个实例推进每个顶点的属性,对于每个实例,最好的例子是三角形中每个顶点的不同颜色。我会用 3 * vec4 *实例填充VBO。
EG。我想用实例绘制2个三角形:
color_vbo [] = {
vec4, vec4, vec4, // first triangle's vertex colors
vec4, vec4, vec4 // second triangle's vertex colors
}; // Imagine this is data in a VBO
glDrawArraysInstanced(GL_TRIANGLES, 0, 3(vertexes), 2(instances));
如果我将属性除数设置为 0 ,它将使用color_vbo的前三种颜色,而不是前进。 实际上,每个顶点都应该从VBO获取属性,就好像它是:
color_attribute = color_vbo[(vertex_count * current_instance) + current_vertex];
答案 0 :(得分:2)
我不认为你使用顶点属性除数可以得到什么。
可以使用OpenGL Insights中描述的“可编程顶点拉动”技术来执行此类操作,您可以使用您喜欢的任何计算从纹理缓冲区读取顶点数据(使用gl_VertexID
和gl_InstanceID
)。
另一种可能性是使用三个顶点属性(每个除数为1)来存储每个三角形点的颜色,并使用gl_VertexID
选择要用于任何给定顶点的属性。显然,这个解决方案不能扩展到每个实例有三个以上的顶点。