07-渲染流程-2-HelloWorld分析

原创 2015年11月18日 09:58:12

Image

"HelloWorld.png”    —> 到屏幕的显示经历了哪些过程?

抛开系统启动的过程,那么所有的渲染方式在Director::drawScene中

在Director::mainLoop中不断的循环该方法进行渲染

1.时间间隔判断

Image(1)

2.确保openGL的视图事件响应-IPhone程序没用-空实现

Image(2)

3.按照优先级调度update函数(每个节点都有这么个函数),然后OpenGL调用清除缓存

Image(3)

4.如果切换场景,就先处理场景切换的逻辑,在setNextScene中,将正在运行的scene release,将下一个scene保存,设置为马上要渲染的scene

Image(4)

5.矩阵操作

pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

6.调用OpenGL来绘制场景树的代码

Image(5)

调用了当前Scene的visit方法,最终其实调用的是Node::visit

以此逐层次将Node对象的渲染逻辑放在_renderer对象集合中

7.visit界面其他附加内容,比如帧率的显示

Image(6)

8.执行渲染,模型视图矩阵管理

Image(7)

9.此时在OpenGL缓存中渲染完成,交换显示

Image(8)

visit 可以说是一个Node节点树的渲染入口。

Scene永远作为一个树的根,在visit 内部会按照树的层次进行渲染,基本按照

     A.绘制子节点中localZorder < 0的

     B.绘制自己

     B.绘制下一层节点

而每个节点的绘制到屏幕,是调用了方法:

virtual void draw(Renderer *renderer, const Mat4& transform, bool transformUpdated);

因而,HelloWorld中需要渲染的节点顺序:

scene -> layer -> sprite

所以重点放在这三类的节点的绘制

scene渲染

没有override draw方法,所以显然调用的Node::draw

Node渲染

Image(9)

显然Node是不会在屏幕上显示什么内容的。

所以Scene本身是不会渲染任何内容的。

layer渲染

Layer 也没有找到draw方法,所以也是没有绘制内容的

sprite渲染

void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
// Don't do calculate the culling if the transform was not updated
_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;
if(_insideBounds)
    {
_quadCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, &_quad, 1, transform);
        renderer->addCommand(&_quadCommand);
#if CC_SPRITE_DEBUG_DRAW
        _customDebugDrawCommand.init(_globalZOrder);
        _customDebugDrawCommand.func = CC_CALLBACK_0(Sprite::drawDebugData, this);
        renderer->addCommand(&_customDebugDrawCommand);
#endif //CC_SPRITE_DEBUG_DRAW
    }

}

到这里我们可以得出一个结论:

开始提出的问题,现在可以等价于

Sprite是如何将一个给予的图片,显示在屏幕上的。

07-渲染流程-1-流程

1.AppControler完成加载后 2.调用了Director,设置了OpenglView,投影的设置就在这个过程里面。 3.调用Application::run 4.在开始运行程序之前,...
  • studyforgis
  • studyforgis
  • 2015年11月13日 12:42
  • 232

07-渲染流程-4-Sprite渲染-渲染命令分析

如果在可视范围内,则需要执行render的addCommand命令 首先我们需要搞清楚两个对象   _quadCommand 和 renderer QuadCommand Sprite使用的...
  • studyforgis
  • studyforgis
  • 2015年11月24日 08:05
  • 393

07-渲染流程-5-Sprite渲染-QuadCommand

我们详细看看init中的几个参数: 1. _globalZOrder 在这里是0,我们没有设置需要全局进行渲染。 2. _texture->getName() 这个参数是纹理缓存。从何而来呢?...
  • studyforgis
  • studyforgis
  • 2015年11月28日 09:41
  • 297

Paraview Reader 的原理以及如何基于VTK写新的Reader

reader的父类的选择是基于reader的输出的类型的,这些父类在VTK中由相对应vtkAlgorithm提供。例如输出vtkPolyData,则父类选择vtkPolyDataAlgorithm。 ...
  • zhz1993622
  • zhz1993622
  • 2014年12月15日 15:22
  • 781

07-渲染流程-3-Sprite渲染-判断是否裁剪分析

我们集中精力来看Sprite的draw() _insideBounds = transformUpdated ? renderer->checkVisibility(transform, _co...
  • studyforgis
  • studyforgis
  • 2015年11月20日 12:06
  • 315

虚幻4 D3D渲染过程的笔记

最近心情很难过。身体也不好。周六请假休息了一下,还是觉得写点东西比较好。哎。 这是虚幻的D3D渲染一个方块的一帧的调用过程的记录。 渲染的调用起始于  GuardedRun.  这也是虚幻的...
  • lqpgfz
  • lqpgfz
  • 2015年11月14日 15:44
  • 1258

Cocos2Dx之渲染流程

渲染时一个游戏引擎最重要的部分。渲染的效率决定了游戏的流畅度清晰度,跟前面的介绍的内容相比,渲染是最具技术含量的事情,也是一个需要很多专业知识的事情。这里我们有这个机会,来学习下一个游戏引擎的渲染是怎...
  • fybing1986
  • fybing1986
  • 2014年11月07日 11:38
  • 393

unity shader:渲染流程

渲染流水线:是cpu和gpu配合渲染一帧的过程,主要分为应用阶段,几何阶段以及光栅化阶段。应用阶段流程:由cpu进行控制,主要流程如下 1.准备哪些对象被渲染,哪些被剔除,然后将要渲染的对象从硬盘加...
  • zjz520yy
  • zjz520yy
  • 2017年08月25日 21:53
  • 561

cocos2d-x渲染流程分析

上层的渲染函数为 Director::drawScene() 。Renderer::render() 为真正的渲染,但是在Renderer::render() 之前,有_runningScene->v...
  • zjhongxian
  • zjhongxian
  • 2014年08月12日 23:36
  • 130

第一回 开篇 D3D渲染流程简介

第一回 开篇 D3D渲染流程简介 http://developer.178.com/201004/65293187592.html   开发这个3D engine已经两年半了,从06年8月...
  • linuxheik
  • linuxheik
  • 2012年10月31日 17:28
  • 1277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:07-渲染流程-2-HelloWorld分析
举报原因:
原因补充:

(最多只允许输入30个字)