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. 使用mybatis注解@Options实现添加记录时返回主键值

    官网:http://www.mybatis.org/mybatis-3/index.html 在使用mybatis作为ORM框架时,我通常更喜欢使用注解而非xml配置文件的方式.业务场景:添加记录之后 ...

  2. swiper display:none 后 在显示 滑动问题

    一般这种问题  必须在本身元素  或者父元素  显示出来  然后调用swiper实例 或者只需加两行 observer:true, // 修改swiper自己或子元素时,自动初始化swiper obs ...

  3. ABP文档笔记 - 规约

    ABP框架 - 规约 简介 规约模式是一个特别的软件设计模式,业务逻辑可以使用boolean逻辑重新链接业务逻辑(维基百科). 实践中的大部分情况,它是为实体或其它业务对象,定义可复用的过滤器. 理解 ...

  4. leetcode刷题笔记342 4的幂

    题目描述: 给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂. 示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false. 问题进阶:你能不使 ...

  5. Minimize the error CodeForces - 960B

    You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined  ...

  6. JavaScript 注释

    JavaScript 注释可用于提高代码的可读性. JavaScript 注释 JavaScript 不会执行注释. 我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性. 单行 ...

  7. 使用Java可以做得一些事

    安卓 Web JSP使用Echarts的最简单的例子 微信 wechat4j weixin-java-tools weixin4j 网络服务器

  8. Java内存泄漏分析系列之三:jstat命令的使用及VM Thread分析

    原文地址:http://www.javatang.com 使用jstat命令 当服务器CPU100%的时候,通过定位占用资源最大的线程定位到 VM Thread: "VM Thread&qu ...

  9. lucene创建索引

    创建索引. 1.lucene下载. 下载地址:http://archive.apache.org/dist/lucene/java/. lucene不同版本之间有不小的差别,这里下载的是lucene ...

  10. Oracle性能优化-读懂执行计划

    Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan' for select * fr ...