C++ OpenGL实例VBO-每个顶点、每个实例的属性

C++ OpenGL实例VBO-每个顶点、每个实例的属性,c++,opengl,glsl,vbo,C++,Opengl,Glsl,Vbo,据我所知,glDrawArraysInstanced()将绘制VBOn次。glVertexAttributeDivisor()使用1,这样每个实例在着色器中都有一个唯一的属性。到目前为止,我可以为每个实例传递不同的颜色,使用vec4*实例,该实例中的每个顶点都将共享该属性,因此三角形的每个实例都有不同的颜色 然而,我要寻找的是一种除数类型,它将提升每个实例的每个顶点的属性,最好的例子是三角形中每个顶点的不同颜色。我会用3*vec4*实例来填充VBO 我想使用实例绘制两个三角形: color_vb

据我所知,glDrawArraysInstanced()将绘制VBOn次。glVertexAttributeDivisor()使用1,这样每个实例在着色器中都有一个唯一的属性。到目前为止,我可以为每个实例传递不同的颜色,使用vec4*实例,该实例中的每个顶点都将共享该属性,因此三角形的每个实例都有不同的颜色

然而,我要寻找的是一种除数类型,它将提升每个实例的每个顶点的属性,最好的例子是三角形中每个顶点的不同颜色。我会用3*vec4*实例来填充VBO

我想使用实例绘制两个三角形:

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,它将在所有位置使用颜色的前3种颜色,而不是前进。 实际上,每个顶点都应该从VBO获取属性,就像它是:

color_attribute = color_vbo[(vertex_count * current_instance) + current_vertex];

我不认为你要的是使用顶点属性除数

可以使用“可编程顶点拉伸”中描述的技术来完成这类操作,在该技术中,您可以使用任意计算从纹理缓冲区读取顶点数据(使用
gl\u VertexID
gl\u InstanceID


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

那么,是否可以不为颜色使用三个单独的属性,而可能使用一个属性作为数组?如果你问我,我真的很惊讶这是不寻常的,而且OpenGL没有考虑到这一点。令人失望…不,你不能有顶点属性数组。平心而论,我认为不可能有一个API能够支持所有可能的使用场景(尽管我同意您的API是一个合理的选择),并且仍然能够有效地实现。如果你想做一些与OpenGL提供的方式不同的事情,你必须寻找更具创造性的技术,比如“弯曲管道”中的“可编程顶点拉伸”(线索在标题中)“OpenGL洞察手册”的一节。@Luka:实际上,您可以通过声明矩阵属性(最多占用4个属性向量“槽”)来使用GL来使用有限的属性集(如数组),并可以使用矩阵上的[]运算符来选择特定的向量4。然而,这将是非常无效的,我强烈建议遵循盖尔特的建议。我也处于同样的情况。每个顶点需要一个向量2。每个实例有4个顶点,使用GL_三角形_带。因此,我有一个mat4x2将实例数据放在一个实例中。然后使用mat4x2[gl_VertexID]为每个顶点只访问一个vec2。我认为这个理论应该是正确的。不幸的是,渲染结果并不理想,非常随机。