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

标签 c++ opengl glsl vbo

据我了解,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_VertexIDgl_InstanceID)从纹理缓冲区读取顶点数据。

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

关于c++ - OpenGL 实例化 VBO - 每个顶点、每个实例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110074/

相关文章:

c++ - 在 C++ 中迭代 .bmp 的像素

java - OpenCV Java JNIEXPORT 内存管理

c++ - SSBO CPU 映射返回正确的数据,但到 GPU 上的 SSBO 的数据为 'different'

c++ - C++ 中的 DevIL 和 OpenGL

c++ - GLUT 纹理人工制品

ios - 在 OpenGL ES 2.0 GLSL 中转置 mat4

c++ - 如何根据一定的概率得到一个值

c++ - Valgrind:是否可以接受越来越多的可能丢失的字节?

opengl - 如何使这段代码在 Mesa3d 上工作?

opengl - GLSL 变量将对象变黑