我建立了一个2D图形引擎,并为其创建了一个批处理系统,如果我有1000个具有相同纹理的精灵,我可以通过一次OpenGL调用来绘制它们。
这是通过将所有具有相同纹理的精灵的所有顶点放入单个vbo顶点数组中实现的。
我不是“打印这些顶点,打印这些顶点,打印这些顶点”,而是“将所有顶点放在一起,打印”,这很清楚易懂。虽然很容易,但现在我正在尝试在3D中实现相同的效果,但是我遇到了一个大问题。
问题在于,我使用模型视图投影矩阵来放置和渲染我的模型,这是在3D空间中呈现模型的常见方法。对于屏幕上的每个模型,我需要传递MVP矩阵到着色器中,以便我可以使用它将每个顶点转换到正确的位置。
如果我在着色器外执行转换,那么它将由CPU执行,这不是一个好主意,原因是显而易见的。
但问题就在那里。我需要将矩阵传递给着色器,但对于每个模型,矩阵都是不同的。
因此,我不能像处理2D精灵那样处理,因为每次更改着色器统一变量都需要进行绘制。
我希望我已经表达清楚了,也许您有一个我没有想到的好主意,或者您已经遇到了同样的问题。我知道事实上有一个解决方案,因为在像Unity这样的引擎中,您可以使用相同的着色器来渲染多个模型,并且只需进行一次绘制调用即可。
这是通过将所有具有相同纹理的精灵的所有顶点放入单个vbo顶点数组中实现的。
我不是“打印这些顶点,打印这些顶点,打印这些顶点”,而是“将所有顶点放在一起,打印”,这很清楚易懂。虽然很容易,但现在我正在尝试在3D中实现相同的效果,但是我遇到了一个大问题。
问题在于,我使用模型视图投影矩阵来放置和渲染我的模型,这是在3D空间中呈现模型的常见方法。对于屏幕上的每个模型,我需要传递MVP矩阵到着色器中,以便我可以使用它将每个顶点转换到正确的位置。
如果我在着色器外执行转换,那么它将由CPU执行,这不是一个好主意,原因是显而易见的。
但问题就在那里。我需要将矩阵传递给着色器,但对于每个模型,矩阵都是不同的。
因此,我不能像处理2D精灵那样处理,因为每次更改着色器统一变量都需要进行绘制。
我希望我已经表达清楚了,也许您有一个我没有想到的好主意,或者您已经遇到了同样的问题。我知道事实上有一个解决方案,因为在像Unity这样的引擎中,您可以使用相同的着色器来渲染多个模型,并且只需进行一次绘制调用即可。