cocos2dx里面有两个渲染队列,RenderQueue和TransparentRenderQueue。我们可以从Renderer::render()的代码看到:

void Renderer::render()
{
//Uncomment this once everything is rendered by new renderer
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //TODO: setup camera or MVP
_isRendering = true; if (_glViewAssigned)
{
//Process render commands
//1. Sort render commands based on ID
for (auto &renderqueue : _renderGroups)
{
renderqueue.sort();
}
visitRenderQueue(_renderGroups[]);
flush(); //Process render commands
//draw transparent objects here, do not batch for transparent objects
if ( < _transparentRenderGroups.size())
{
_transparentRenderGroups.sort();
glEnable(GL_DEPTH_TEST);
visitTransparentRenderQueue(_transparentRenderGroups);
glDisable(GL_DEPTH_TEST);
}
}
clean();
_isRendering = false;
}

先绘制的是RenderQueue,没有启用深度检测,之后绘制的TransparentRenderQueue才会启用深度检测。

一般情况下我们使用的是RenderQueue,它有如下性质:

1. RenderQueue里面的东西完全是按Zorder来决定渲染的先后顺序的,Zorder越小越靠前。

2. 若Zorder相等,则按chlid队列中的顺序决定,先加入到队列的靠前。

3. 可以使用glBlendFunc做颜色混合以及使用2D shader(因为颜色混合需要禁用深度缓存或者把深度缓存设为只读)

若要启用深度检测,我们则需要把绘制物体放入TransparentRenderQueue中,方法就是设置onDraw回调的时候,设置command的tansparent为ture,如:

_customCommand.init();
_customCommand.func = CC_CALLBACK_0(CCGSpell::onDraw, this, transform, flags);
_customCommand.setTransparent(true);
renderer->addCommand(&_customCommand);

若要将Sprite放入TransparentRenderQueue,则要像上面那样修改Sprite::draw(),或者在子类中override它。

由于TransparentRenderQueue无法使用颜色混合(虽然修改Render模块可以做到,但一般情况下最好是不要修改cocos2dx的代码),我们主要使用的还是RenderQueue。

只是使用RenderQueue绘制3D场景的时候经常会遇到如下问题,先贴代码:

auto marisa = CCGSprite::create("textures/marisa.png");
marisa->setAnchorPoint(Vec2(0.5, ));
marisa->setPosition3D(Vec3(origin.x, origin.y - , ));
addChild(marisa, ); auto mare = CCGSprite::create("textures/mare.png");
mare->setAnchorPoint(Vec2(0.5, ));
mare->setPosition3D(Vec3(origin.x, origin.y - , -));
addChild(mare, ); auto spr3D = Sprite3D::create("Sprite3DTest/boss1.obj");
spr3D->setScale(.f);
spr3D->setTexture("Sprite3DTest/boss.png");
spr3D->setPosition3D(Vec3(origin.x, origin.y, -));
spr3D->runAction(RepeatForever::create(RotateBy::create(, )));
addChild(spr3D); auto ground = CCGSprite::create("textures/grassHR.jpg");
ground->setPosition3D(Vec3(origin.x, origin.y - , ));
ground->setRotation3D(Vec3(-, , ));
addChild(ground, );

场景中除动画人物外有4个精灵,其中有一个3D精灵spr3D,以及一个绕x轴旋转90度的ground。若按上面的代码会得到如下效果:

与xy平面平行部分都OK,但是与xy平面垂直的ground却压在所有精灵上面,这就是没有深度检测造成的。

说到这里就不得不说下Zorder与positionZ的关系。

在调用setPosition3D,setPositionZ的时候,其实是做了两件事:

1. 根据positionZ设置transform,也就是实际渲染在场景中的位置。

2. 用positionZ设置GlobalZOrder的值,而GlobalZOrder则决定了渲染顺序。

那么上面问题的原因就是ground的Zorder最大(依次是0, -1000, -500, 0),而且addchild是在Zorder同样大的marisa之后。

因此是最后渲染出来的。

那么,如果我们不想移动ground的位置,又想把ground移到最后,那么单独设置一下ground的Zorder便可:

auto ground = CCGSprite::create("textures/grassHR.jpg");
ground->setPosition3D(Vec3(origin.x, origin.y - , ));
ground->setRotation3D(Vec3(-, , ));
ground->setGlobalZOrder(-);
addChild(ground, );

修改后的效果如下:

而对于GlobalZOrder和LocalZOrder的区别是,GlobalZOrder改变的是物体在整个Scene中的渲染顺序,而LocalZOrder改变的只是物体在其父节点下的渲染顺序。

由于本例的父节点就是Scene,因此GlobalZOrder和LocalZOrder的效果是相同的。

cocos2dx深度检测与Zorder的更多相关文章

  1. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

  2. 工信部公示网络安全示范项目 网易云易盾“自适应DDoS攻击深度检测和防御系统”入选

    本文由  网易云发布. 工信部官网 2017年年底,经专家评审和遴选,中华人民共和国工业和信息化部(以下简称“工信部”)公示了2017年电信和互联网行业网络安全试点示范项目,网易云易盾的“自适应DDo ...

  3. Deep Protein Methylation Profiling by Combined Chemical and Immunoaffinity Approaches Reveals Novel PRMT1 Targets (结合层析法和免疫沉淀法的蛋白甲基化的深度检测技术发现了PRMT1新的靶标蛋白)

    题目:Deep Protein Methylation Profiling by Combined Chemical and Immunoaffinity Approaches Reveals Nov ...

  4. DPI (Deep Packet Inspection) 深度包检测技术

    详解DPI与网络回溯分析技术 随着网络通讯技术进步与发展,网络通讯已跨入大数据时代,如何监控各类业务系统的通讯数据在大数据流量中传输质量,以及针对海量的网络通讯数据的范畴中存在少量的恶意流量的检测,避 ...

  5. DPI (深度报文检测) 关于DPI的学习笔记

    关于DPI的学习笔记 先看一下定义 : DPI(Deep Packet Inspection)是一种基于数据包的深度检测技术,针对不同的网络应用层载荷(例如HTTP.DNS等)进行深度检测,通过对报文 ...

  6. 深度包检测(DPI)详细介绍

    目录 简介 背景 流量识别 常用功能 具体功能 做法 特征识别 架构举例 部署方式 串接方式 并接方式 存在问题 检测引擎举例 参考文献 简介 DPI(Deep Packet Inspection)深 ...

  7. OpenGL编程(七)3D模型的深度(z轴)检测

    下图是我们要修改后的效果图: 一.深度检测 1.模型Z轴显示有问题: 上一次试验中,如果认真留意,会发现一个问题.当控制锥体在左右或上下旋转时,你会发现锥体看起来是在+-180度之间来回摆动,而不是3 ...

  8. cocos2dx 2.x 骨骼动画优化

    本文原链接:http://www.cnblogs.com/zouzf/p/4450861.html 公司用的骨骼动画的版本貌似还停留在2.1之前的年代而已没有更新,该因各种历史原因吧,而有个大项目“一 ...

  9. cocos2d-x绑定ccb文件

    首先,ccb文件是如何生成的,我就不多说了,大家可以搜下cocosbuilder,就能找的相关的教程,而通过cocosbuilder,我们可以省去了很多设计的麻烦,比如设计一个精灵的位置啥的,而通过c ...

随机推荐

  1. input中v-model和value不能同时调用时解决方案

    <input type="text" v-model="keyWord" value="请输入地名地址" > 当使用如上代码时, ...

  2. 0428-css样式

    一.CSS样式表      引入的三种方式1.内联样式:标签内部     style2.内嵌样式:<head></head>标签内部(<style></sty ...

  3. Android中典型的ROOT原理(5)

    ROOT的作用 Customization 用户的个人定制,如删除一些预安装,定制开机动画等. 特权操作 所有需要特权操作的基本都是要通过ROOT,这也是ROOT的初衷. ROOT的第一步:寻找漏洞并 ...

  4. DB2 911错误的解释

    SQL0911N  因为死锁或超时,所以当前事务已回滚.原因码为 "<原因码>". 说明: 当前工作单元参与了未解决的对象争用,因此必须回滚. 原因码如下所示: 2   ...

  5. Unity发布至IOS的流程(踩坑记录)

    这篇文章主要用于记录本人亲身经历过的Unity发布到IOS平台所遇到的所有坑(其实也就是一些自己并不明白的强制设定),以便于后续再有类似需求时少走些弯路. 我的环境: Unity 5.2.2 个人版( ...

  6. Apache ActiveMQ实战(2)-集群

    ActiveMQ的集群 内嵌代理所引发的问题: 消息过载 管理混乱 如何解决这些问题--集群的两种方式: Master slave Broker clusters ActiveMQ的集群有两种方式: ...

  7. 好IT男不能“淫”-谈IT人员目前普遍存在的“A情绪”

    <如果当道德无法约束你的时候...那么就让对疾病的恐惧来制约你吧> 前言 在写这篇文章前我的心情无比的沉重.几次提笔欲写,几次又未能完成,可是最终让我"奋笔疾书"的原因 ...

  8. 浅析"Sublabel-Accurate Relaxation of Nonconvex Energies" CVPR 2016 Best Paper Honorable Mention

    今天作了一个paper reading,感觉论文不错,马克一下~ CVPR 2016 Best Paper Honorable Mention "Sublabel-Accurate Rela ...

  9. 对于给定的整数集合S,求出最大的d,使得a+b+c=d。

    对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...

  10. nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解

    1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...