opengl - 使用单个绘制调用在 OpenGL 中渲染多个模型

标签 opengl 3d shader

我构建了一个 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/

相关文章:

c++ - 这个上下文创建有什么问题?

python - 在 matplotlib python 中以 3D 形式动画绘制两种不同的颜色和形状

opengl - C++图形化编程

javascript - 使用 Three.js 如何沿指定平面移动对象?

glsl - 使用GLSL在平面上渲染平滑的引用网格

c++ - Maya API - 从 Material 中获取网格

c++ - 编写支持 OpenGL 的 GUI

xcode - 仅向 1 个方向移动 OpenGL 模型

javascript - Three.js THREE.DoubleSide 在 IE 11 中不起作用

c++ - 为什么 glDrawElements 给我 GL_OUT_OF_MEMORY?