OpenGL Instancing VBO - 每个顶点,每个实例的属性

Posted

技术标签:

【中文标题】OpenGL Instancing VBO - 每个顶点,每个实例的属性【英文标题】:OpenGL Instancing VBO - Attribute per Vertex, per Instance 【发布时间】:2014-03-01 04:22:57 【问题描述】:

据我了解, 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];

【问题讨论】:

我也有同样的情况。我需要为每个顶点一个 vec2。每个实例有 4 个顶点,使用 GL_TRIANGLE_STRIP。所以我有一个 mat4x2 将实例数据放到一个实例中。然后使用 mat4x2[gl_VertexID] 为每个顶点仅访问一个 vec2。我认为理论应该是正确的。不幸的是,渲染结果不是我们想要的,非常随机。 【参考方案1】:

我认为使用顶点属性除数不可能实现您的要求。

可以使用OpenGL Insights 中描述为“可编程顶点拉动”的技术来执行此类操作,您可以使用您喜欢的任何计算从纹理缓冲区读取顶点数据(使用gl_VertexIDgl_InstanceID )。

另一种可能性是使用三个顶点属性(每个属性的除数为 1)来存储每个三角形点的颜色,并使用 gl_VertexID 选择用于任何给定顶点的属性。显然,此解决方案无法扩展到每个实例的顶点数超过三个。

【讨论】:

是否有可能没有 3 个单独的属性仅用于颜色,但可能使用一个属性作为数组?如果你问我,我真的很惊讶这是不常见的,并且在 OpenGL 中没有考虑过。失望... 不,你不能有顶点属性数组。公平地说,我认为不可能有一个 API 支持所有可能的使用场景(尽管我同意你的做法是合理的)并且仍然可以有效地实现。如果您想以与 OpenGL 提供的方式不同的方式做一些事情,则必须寻找更具创造性的技术,例如“弯曲管道”(标题中的线索)部分中的“可编程顶点拉动”。 OpenGL Insights 书。 @Luka:您实际上可以滥用 GL 来使用有限的属性集,如数组 - 通过声明矩阵属性(最多需要 4 个属性向量“ slot"),并且可以使用矩阵上的 [] 运算符来选择特定的 vec4.但是,这将非常低效,我强烈建议您遵循 GuyRT 的建议。

以上是关于OpenGL Instancing VBO - 每个顶点,每个实例的属性的主要内容,如果未能解决你的问题,请参考以下文章

3D Computer Grapihcs Using OpenGL - 14 OpenGL Instancing

OpenGL 使纹理透明 VBO

使用 VBO 在 OpenGL 中渲染人群

OpenGL学习脚印:创建更多的实例(instancing object)

instancing

OpenGL - 错误地创建多个 VBO