实验目的
- 熟悉帧调试器的功能,各个面板的意义等
- 进一步理解渲染流程
帧调试器基本介绍
帧调试器可以查看每一个渲染事件使用的shader、pass、keywords等属性,以及当前渲染的目标(如阴影映射纹理、深度纹理、帧缓存等),还可以查看shader中一些计算变量(纹理、坐标、矩阵等),配合Game窗口可以很好的理解渲染的步骤
场景搭建
光照
平行光:Shadow Type为Soft,Render Mode为Auto(当前实验中实际执行时是Important)
物体
立方体:Cast Shadows选择On,勾选Receive Shadows,材质为BumpSpecular,使用BumpedSpecular着色器(取自UnityShaderBook中附带shader)
球体:Cast Shadows选择On,勾选Receive Shadows,材质为BumpSpecular,使用BumpedSpecular着色器(取自UnityShaderBook中附带shader)
平面1 - 地面:Cast Shadows选择On,勾选Receive Shadows,材质为Wall,使用Standard着色器
平面2 - 墙面:Cast Shadows选择Two sided,勾选Receive Shadows,材质为Floor,使用Standard着色器
实验
实验1:平行光的阴影渲染
使用搭建好的场景进行实验
渲染事件列表
上面的渲染事件可以分为6个部分:
1.UpdateDepthTexture:摄像机深度纹理计算
右侧Game窗口可以看到球体、立方体、地面、墙面的深度值(需要调高亮度要瞎了)
2.RenderShadowMap:平行光阴影映射纹理计算
右侧Game窗口可以看到,这里其实是渲染了一个类似MipMap的纹理
3.Collect Shadows:计算屏幕空间的阴影映射纹理
4.Render Loop:渲染物体
这里TempBuffer的尺寸(351 * 362)其实就是Game窗口的尺寸
5.Render Skybox:渲染天空盒
6.ImageEffects:后期特效(Post-Process)
当前实验中没有加入后期特效,暂时略过
实验2:非平行光的渲染
添加一个聚光灯,不开启阴影
渲染事件列表
可以看到整体的渲染事件从32个变成了34个,排查发现,Render Loop部分多出了2个渲染事件,是聚光灯对地面和球体的影响
实验3:非平行光的阴影渲染
将实验2中的聚光灯的阴影类型设置为软阴影
渲染事件列表
整体渲染事件从34变成了37,排查发现是对球体和地面又进行了一次聚光灯的阴影映射纹理计算
使用ForwardAdd Pass,Keywords为SHADOWDEPTH_SOFT SPOT,blend为one one
复制聚光灯1为聚光灯2,调整位置、颜色
渲染事件列表变化
渲染效果并不好很生硬
实验4:不重要的非平行光的渲染
将实验3中的聚光灯2渲染模式设置为Not Important(前4个非平行光会被默认设置为Important),这样聚光灯2就不会按照逐像素进行渲染
渲染事件总数维持在37,渲染结果上的变化发生在Render Loop中,可以看出聚光灯2的蓝色光直接和平行光一起盖在了地面上,并没有像聚光灯1一样另外多出渲染事件(即没有影响到)
猜测是因为帧调试器不会单独展示顶点着色器中的过程,而是执行完一个完整的subshader,因此作为Not Important光源的聚光灯2的顶点光照被直接渲染出来了
实验5:影响Draw Call合批的因素
1.材质,需同材质(不同材质,同shader也不行)
2.顶点数,需小于300
3.受光,需受到同样的光照影响
4.Shadow Caster是否相同,包括参数、Keywords
5.待验证