【问题标题】:How cocos2d-x and cocos2d-iphone guarantee the correct zorder(occlusion) for a single batch drawing of 2 sprites?cocos2d-x 和 cocos2d-iphone 如何保证单批绘制 2 个精灵的正确 zorder(occlusion)?
【发布时间】:2018-06-29 10:13:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ opengl-es cocos2d-iphone cocos2d-x


    【解决方案1】:

    我在 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 较高的那个之前绘制。它们实际上并没有被拉在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多