Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在2d opengl引擎中进行分层绘图?_Opengl_2d_Layer - Fatal编程技术网

如何在2d opengl引擎中进行分层绘图?

如何在2d opengl引擎中进行分层绘图?,opengl,2d,layer,Opengl,2d,Layer,我正在做一个2D游戏,现在正在做图形引擎,并达到了臭名昭著的透明度/深度测试问题,我打算通过将场景分解为几个重叠层来解决这个问题,因此我不需要对所有内容进行深度排序 我应该根据对象所在的层将对象分离到不同的容器中,还是应该使用某种缓冲区在不同的层上绘制对象,然后最终将它们混合在一起?如果我使用后者,我应该使用什么,或者我应该如何确切地使用它 谢谢你的帮助 听起来你已经很好地掌握了你要做的事情。我猜在对每个对象进行排序或将所有内容渲染到层然后进行合成之间的选择有点随意。如果您打算对每个层应用不同的

我正在做一个2D游戏,现在正在做图形引擎,并达到了臭名昭著的透明度/深度测试问题,我打算通过将场景分解为几个重叠层来解决这个问题,因此我不需要对所有内容进行深度排序

我应该根据对象所在的层将对象分离到不同的容器中,还是应该使用某种缓冲区在不同的层上绘制对象,然后最终将它们混合在一起?如果我使用后者,我应该使用什么,或者我应该如何确切地使用它


谢谢你的帮助

听起来你已经很好地掌握了你要做的事情。我猜在对每个对象进行排序或将所有内容渲染到层然后进行合成之间的选择有点随意。如果您打算对每个层应用不同的效果,或者尝试重用某些图形(例如,如果您有一个很少更新的背景层,或者可以以较低的fps运行),则使用基于层的系统更有意义。另一方面,如果你打算在每一帧都重新绘制所有内容,并且不需要花哨的每层技巧,那么你最好只对对象进行排序,因为这样会使用更少的GPU内存/填充率来blit周围的所有纹理。

我想引用这一结论:

这样做的结果很简单,如果没有特殊考虑,您不能简单地以任何顺序渲染半透明对象。如果有足够多的半透明曲面以足够复杂的方式四处移动,您将发现使用可接受的实时算法很难避免错误

这在很大程度上取决于你准备容忍什么,以及你对场景内容的先验知识

我同意,大部分取决于你画的是什么

请记住,片段着色器有一个discard关键字,这是您的朋友:如果您正在使用纹理创建对象,这将帮助您避免排序。我会注意到,通过在同一层中渲染半透明/透明对象,将来可能会遇到同样的问题


也许,最好实现已排序的对象树,以避免每帧对每个对象进行排序。但这完全取决于对象的组织和应用程序约束。

如果我使用按对象深度值进行深度排序(因此根本不使用层),那么对每帧数千个精灵进行排序是否可行?另外,使用帧缓冲区对象似乎是更好的主意,但我不知道从哪里开始:SI在成为问题之前不会担心开销。首先让它工作,然后优化。在这里,使用多个FBO还是仅使用一个FBO之间的唯一决定因素应该是您是否希望执行需要使用前者的复杂效果。