据我了解,glDrawArraysInstanced() 将绘制 VBO n 次。 glVertexAttribDivisor() 使用 1,以便每个实例在着色器中都有唯一的属性。到目前为止,我可以使用 vec4*instances 为每个实例传递不同的颜色,并且该实例中的每个顶点将共享该属性,因此三角形的每个实例都有不同的颜色。
但是,我正在寻找一种除数,它将提高每个实例的每个顶点的属性,最好的例子是每个实例的三角形中每个顶点的不同颜色。我会用 3*vec4*instances 填充 VBO。
例如。我想使用实例绘制 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 的前 3 种颜色,而不是前进。 实际上,每个顶点都应该从 VBO 获取属性,就好像它是:
color_attribute = color_vbo[(vertex_count * current_instance) + current_vertex];
最佳答案
我认为使用顶点属性除数不可能实现您的要求。
可以使用 OpenGL Insights 中描述的技术来完成此类操作。作为“可编程顶点拉取”,您可以使用您喜欢的任何计算(使用 gl_VertexID
和 gl_InstanceID
)从纹理缓冲区读取顶点数据。
另一种可能性是使用三个顶点属性(每个属性的除数为 1)来存储每个三角形点的颜色,并使用 gl_VertexID
选择用于任何给定顶点的属性。显然,此解决方案无法扩展到每个实例具有超过三个顶点。
关于c++ - OpenGL 实例化 VBO - 每个顶点、每个实例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110074/