Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
C++ 带OpenGL的2D引擎:使用Z缓冲区还是自己的实现进行sprite排序?_C++_Opengl_2d_Layer - Fatal编程技术网

C++ 带OpenGL的2D引擎:使用Z缓冲区还是自己的实现进行sprite排序?

C++ 带OpenGL的2D引擎:使用Z缓冲区还是自己的实现进行sprite排序?,c++,opengl,2d,layer,C++,Opengl,2d,Layer,如果我在做一个3D引擎,这个问题的答案会很清楚:我会使用深度缓冲区,而不是考虑自己对所有多边形进行排序 然而,这与2D的情况不同,因为在这里,层可以在没有OpenGL帮助的情况下轻松实现,然后您甚至可以在层中排序和移动精灵。(这在OpenGL afaik中是不可能的) < Li >(为什么)我应该使用OpenGL深度缓冲区代替在CPU上运行的C++层系统? 深度缓冲区版本会慢多少 P>我清楚地看到,在C++中制作一个层系统将完全没有性能影响,因为我必须在精灵中迭代以进行渲染。 < P>我建

如果我在做一个3D引擎,这个问题的答案会很清楚:我会使用深度缓冲区,而不是考虑自己对所有多边形进行排序

然而,这与2D的情况不同,因为在这里,层可以在没有OpenGL帮助的情况下轻松实现,然后您甚至可以在层中排序和移动精灵。(这在OpenGL afaik中是不可能的)

    < Li >(为什么)我应该使用OpenGL深度缓冲区代替在CPU上运行的C++层系统?
  • 深度缓冲区版本会慢多少

<> P>我清楚地看到,在C++中制作一个层系统将完全没有性能影响,因为我必须在精灵中迭代以进行渲染。

< P>我建议你在软件中做它,因为你可能想在你的精灵上使用透明度,这意味着你从前面到前面渲染它们。另外,对两个精灵进行排序也不应该对CPU有太高的要求。

直接回答:

  • 允许GPU使用深度缓冲区将允许您动态调整事物的绘制顺序,而无需在CPU上进行任何洗牌,并且在有点虚构的情况下,您无需将事物分配到不同的层,例如,你可以有像投射物一样的效果,从背景向玩家的方向投射,然后在玩家的前面投射,而不必一直计算将它们分配到哪一层
  • 在GPU上,深度的使用不会产生可测量的影响,即使你使用的是嵌入式芯片、十多年前的插件卡或集成部件;它们是现代GPU的基础,因此从实用角度来看,它们被优化为零成本
然而,我想你实际上想在CPU上做这件事,原因很简单,就是正确处理透明度。深度缓冲区每像素存储一个深度,因此,如果您绘制一个接近透明的对象,然后尝试在其后面绘制某个对象,则后面的对象将不会被绘制,即使它应该是可见的。在2d游戏中,消除混叠可能会使精灵的边缘部分透明;如果按绘图顺序将图形提交到GPU,则部分透明胶片将始终正确合成。如果你离开z缓冲区去做这件事,那么你可能会有看起来很奇怪的边缘。

如果可以的话,两者都用

深度信息对于后期处理和3D眼镜之类的东西很好,所以你不应该把它扔掉。这种效果对于2D游戏来说非常好。 此外,如果前后绘制(不透明)图层,则可以保存填充率,因为Z缓冲区可以为您进行剪裁(深度测试比实际绘制速度快)。 深度测试通常几乎是免费的,尤其是当你得到分层的Z信息时。由于这一点和填充率的节省,使用深度测试可能会更快


另一方面,软件排序很好,因此您可以对不透明精灵进行前后渲染,并且必须正确进行alpha混合(当然,您可以前后绘制这些精灵)。

我认为完全由您决定。。。在DirectX中制作二维瓦片滚动引擎时,我选择在纯C++中绘制自己的图层。然而,我的精灵也由一个纹理组成(换句话说,阴影被嵌入到框架中,我只有两层瓷砖和精灵)