从FrameDebugger看Unity渲染(一)
Unity如何渲染一个3D+2D的游戏画面,今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
Unity 渲染场景的几个主要部分
Unity内置渲染管线是基于摄像机来进行渲染的,每个摄像机按照摄像机的渲染顺序来依次渲染,渲染完一个摄像机,再渲染下一个摄像机。对于UI 2D而言,相当于也是一个独立的UI摄像机,还有一种特殊的OnGUI会绘制2D GUI物体,走的是GUI Paint。如图所示 FrameDegbuger 最外层的截图如下:
FrameDebugger显示渲染有3个部分,第一个是Camera.Render, 表示的是基于场景中的摄像机引起的渲染。第二部分UGUI.Rendering.RenderOverlays,表示的UGUI中2DUI引起的渲染。第三部分GUI.Repaint, 表示的是OnGUI引发的2D UI物体渲染; 如果你的项目中没有OnGUI的渲染物体,FrameDebugger中就不会有相关的显示。第一部分Camera.Render里面有每个摄像机按照摄像机的渲染顺序依次次排列下来。如图所示,目前场景中有两个摄像机,FrameDebugger按照摄像机的渲染顺序一次排列下来。
Unity 摄像机渲染处理哪些事情?
如上图所示,每个摄像机有3个部分,第1部分UpdateDepthTexture是处理阴影投影相关。如果整个场景中没有实时的阴影投影,就不会有这一部分。第2部分Drawing是具体的绘制物体相关, 第3部分Camera.ImageEffects相关是摄像机的后期处理相关。展开 UpdateDepthTexture, 分为了Clear与DepthPass.Job两个部分,如图所示:
Clear是清理, DepthPass.Job详细的记录里面哪些物体做了ShadowCaster Pass。展开Drawing部分, FrameDebugger根据场景中涉及到的渲染队列,一次进行渲染,如下图所示,首先是Render.Opaque渲染队列,随后是Render.Transparent渲染队列。
Unity 摄像机范围外的物体不会被渲染
FrameDebugger中详细的显示了在当前帧中Unity实际渲染了哪些物体。在摄像机范围内的物体会被Unity渲染,不在摄像机范围内的物体,是不会被摄像机渲染的。渲染物体时,还会做阴影计算,从阴影纹理里面获取阴影数据。
当前帧中在当前摄像机下渲染了哪些物体,都能通过FrameDebugger看清楚。点击FrameDebugger中的每个渲染物体,就能对应到场景中的具体的物体。
被渲染物体的详细信息
最后Unity渲染每个物体的时候,我们能够看到渲染时候的详细信息,如图所示:
Event #554: 第554次绘制事件;
Shader: 渲染这个物体采用的是哪个Shader的哪个SubShader;
Blend: 着色到目标的颜色混合规则;
ZClip: 开启片元深度检测模式,如果一个片元在near与far的外面就会被丢弃;
ZTest:深度测试的规则,根据通过深度测试的才会被渲染;
ZWrite: 是否将当前片元的深度信息写入深度缓存;
Cull: 裁剪剔除的模式,有back, front, none三种模式,分别是裁剪剔除掉背对摄像机的面,裁剪提出掉真对摄像机的面和不裁剪剔除。
Why Drawcall cannot be batched?:不能合批的原因描述;
ShaderProperties: CPU传递给GPU的数据的详细信息;
今天的FrameDebugger与渲染的分享就到这里了,关注我们,获取更多的渲染优化相关的教程与知识。
网友评论