首页 > 解决方案 > cocos2d-x 和 cocos2d-iphone 如何保证单批绘制 2 个精灵的正确 zorder(occlusion)?

问题描述

对于 2d 绘图,按照绘图顺序执行遮挡。后一个将遮挡前一个。但是当所有的绘图都在一次调用中完成时,cocos2d-x(和 cocos2d iphone for spriteBatchNode)如何保证正确的遮挡?

举个简单的例子,sprite B 和 sprite C 都在节点 A 下。它们具有相同的纹理、shader、blendFunc,这使得它们可以通过 cocos2d-x 3.x 的自动批处理渲染系统进行优化(在这种情况下)在 cocos2d-iphone 中,它们使用与纹理相同的 spritesheet,并在相同的 spriteBatchNode 下),并在一次 glDrawElements 调用中绘制。AFAIK,此时已禁用 gles 的深度测试。如果我们想让精灵C覆盖精灵B,我们应该先画B,然后画C。但现在它们被画在一起了。渲染系统如何保证C和B的正确遮挡?

如果我犯了任何错误,请纠正我。

标签: c++opengl-escocos2d-iphonecocos2d-x

解决方案


我在 OpenGL 规范中找到以下引用“这意味着,例如,必须完全绘制一个图元,然后任何后续图元才能影响帧缓冲区” https://www.khronos.org/registry/OpenGL/specs/es/ 3.2/es_spec_3.2.pdf

因此,我得出结论,图元是按照它们在顶点数组中出现的顺序绘制的。这保证了结果的稳定性。

参考:

https://www.opengl.org/discussion_boards/showthread.php/176630-Rendering-order-within-a-single-draw-call

https://forums.imgtec.com/t/order-of-operation-for-vertex-arrays/787

最后,虽然 B 和 C 被绘制在一个 中glDrawElements,但它们的图元在顶点数组中的顺序不同。所以在 Cocos2d-x 中,较低的localZOrder将在较高的之前绘制localZOrder。他们实际上并没有被拉到一起。


推荐阅读