一. DefaultRenderer 渲染流程
DefaultRender是away3d默认的渲染模式,在每帧绘制时View3D按照以下流程进行绘制:
1. 清空渲染对象列表,并重新填充该列表 _entityCollector:EntityCollector,重新填充渲染对象的方法则是遍历
场景中的所有节点,判断该节点的包围盒是否在相机的截头体内(EntityCollector::enterNode(node:NodeBase):bool)
如在相机范围内在存入
EntityCollector._entityHead可渲染对象列表中。
_
scene.traversePartitions(_entityCollector);
2. 如果当前有滤镜效果(后处理),则使用RTT(render to texture)先将当前帧数据绘制到纹理(绘制方式跟正常渲 染方式一致如下所述),在对此纹理与滤镜效果共同绘制到后台缓冲区。
if (_filter3DRenderer && _stage3DProxy._context3D) {
_renderer.render(_entityCollector, _filter3DRenderer.getMainInputTexture(_stage3DProxy), _rttBufferManager.renderToTextureRect);
_filter3DRenderer.render(_stage3DProxy, camera, _depthRender);
}
_renderer.render(_entityCollector, _filter3DRenderer.getMainInputTexture(_stage3DProxy), _rttBufferManager.renderToTextureRect);
_filter3DRenderer.render(_stage3DProxy, camera, _depthRender);
}
3. 绘制场景中所有可渲染对象,此处即为DefaultRenderer 与 DeferredRender不同的根本所在,此处为默认的前 向渲染方式DefaultRenderer的渲染流程:
a. 遍历场景中所有灯光如果灯光会产生阴影效果则绘制depthMap以备绘制阴影时使用。
注: 可以通过directionalLight = new DirectionalLight(0, -1, 0); shadow = new HardShadowMapMethod( directionalLight ); 设置绘制阴影图的方式,并将该阴影的绘制方式添加到地面材质中绘制 planeMaterial.shadowMethod = shadow;
b. 遍历当前所有可渲染对象对每个渲染对象分别进行绘制(先绘制不透明再绘制透明对象)。
注: 对每个材质分别进行绘制 为没个材质计算diffuse speculatede等绘制。
4. 若有滤镜效果则进行后处理渲染,并将此帧渲染结果提交后台缓冲区。
默认的前向渲染方式是对每个渲染对象的材质分别进行光照效果的计算,这是与延迟渲染的根本的不同。
二. DeferredRender 渲染流程
与DefaultRender相比延迟渲染的流程前两个步骤基本一致,主要区别在与渲染方式的第三步骤,延迟渲染的基本流程是先绘制所有对象获取在后面光照中需要的信息存储在GBuffer中,在进行所有光照的绘制具体流程如下:
注: gbuffer中存储的数据信息有顶点 法线 颜色 深度值等信息 ,在此分别将存放在三张纹理当中。
a. 更新Gbuffer中的数据,为每个可渲染对象分别绘制深度 法线 顶点等数据到buffer中(纹理)
b. 绘制所有灯光信息(绘制到纹理)
c. 将GBuffer和灯光数据再次绘制到后台缓存区.