我构建了一个 2D 图形引擎,并为它创建了一个批处理系统,因此,如果我有 1000 个具有相同纹理的 Sprite ,我可以通过一次调用 openGl 来绘制它们。
这是通过将具有相同纹理的所有 Sprite 的所有顶点放入单个 vbo 顶点数组来实现的。
我不是“打印这些顶点,打印这些顶点,打印这些顶点”,而是“将所有顶点放在一起,打印”,只是为了非常清楚。
很简单,但现在我试图在 3D 中实现同样的目标,但我遇到了一个大问题。
问题是我使用模型 View 投影矩阵来放置和渲染我的模型,这是在 3D 空间中渲染模型的常用方法。
对于屏幕上的每个模型,我需要将 MVP 矩阵传递给着色器,以便我可以使用它来将每个顶点转换到正确的位置。
如果我要在着色器之外进行转换,它将由 cpu 执行,这不是一个好主意,原因显而易见。
但问题出在那里。我需要将矩阵传递给着色器,但对于每个模型,矩阵是不同的。
所以我不能像使用 2d Sprite 那样做,因为每次更改着色器制服都需要绘制。
我希望我已经说清楚了,也许你有一个我没有的好主意,或者你已经遇到了同样的问题。我知道某处有一个解决方案,因为在像 Unity 这样的引擎中,您可以对多个模型使用相同的着色器,并且只需一次绘制调用即可
最佳答案
存在一个与您正在寻找的功能完全相同的功能,它被称为 实例化 .通过实例化,您可以存储 n
统一缓冲区中的矩阵(或其他任何你需要的)并调用 glDrawElementsInstanced
画画n
副本。在着色器中,你会得到一个额外的输入 gl_InstanceID
,您可以使用它对 Uniform Buffer 进行索引以获取该特定实例所需的矩阵。
您可以在此处阅读有关实例化的更多信息:https://www.opengl.org/wiki/Vertex_Rendering#Instancing
关于opengl - 使用单个绘制调用在 OpenGL 中渲染多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834945/