c++ - 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的正确遮挡?
如果我犯了任何错误,请纠正我。
解决方案
我在 OpenGL 规范中找到以下引用“这意味着,例如,必须完全绘制一个图元,然后任何后续图元才能影响帧缓冲区” https://www.khronos.org/registry/OpenGL/specs/es/ 3.2/es_spec_3.2.pdf
因此,我得出结论,图元是按照它们在顶点数组中出现的顺序绘制的。这保证了结果的稳定性。
参考:
https://forums.imgtec.com/t/order-of-operation-for-vertex-arrays/787
最后,虽然 B 和 C 被绘制在一个 中glDrawElements
,但它们的图元在顶点数组中的顺序不同。所以在 Cocos2d-x 中,较低的localZOrder
将在较高的之前绘制localZOrder
。他们实际上并没有被拉到一起。
推荐阅读
- java - redstone.xmlrpc.XmlRpcException:发生网络错误。=> 如何解决这个问题?
- php - PHP浮点循环不匹配值
- reactjs - react-input-mask 每四个字符添加空格而不知道高级文本的长度
- arrays - 使用 JsonArrayRequest android studio 获取没有名称的 JsonArray 并解析为 List
- data-structures - 在 CodeSys 中初始化多个电机的最佳变量结构
- android - 我如何将 khttp 响应传递给 javalin
- r - 如何数值求解“悬索问题”中的比例因子
- flutter - 如何在flutter中将textscalefactor设置为整个应用程序
- node.js - 不支持 ALGORITHM=COPY。原因:参与外键的列被重命名
- python - 我是 pycharm 新手,遇到了一些问题