烘焙光
“全局照明”这类的数学模型很耗cpu, 因为它要模拟光在现实中的各种反射和与环境的各种交互,计算量大。
既然计算量大,那么就不要放在实时计算(所谓实时就是在更新每一帧时都要计算),而是预先计算好光的数据,存起来,在渲染的时候直接拿来用。
Unity里有:有向光、射光、点光、区域光 四种类型。
Unity 烘焙各个对象的光数据,把烘焙的光数据保存到各个对象的贴图里面。
对象的材料里的着色器用含有光数据的贴图、颜色和法线信息给对象自己着色。
可以在inspecter里配置单个光源的mode属性,决定该光源是否能使移动的GameObject产生投影。
性能方面的考虑因素:烘焙的数据占显存、着色器解码烘焙数据消耗cpu。
渲染路径
Forward Rendering:对于每个对象,每个光源都渲染一次。优点:快,可处理透明、抗锯齿。缺点:光源多的话,计算量增大。
Deferred Rendering:需要高性能的设备。
颜色空间
通常,硬件资源的限制决定了我们能够选择哪一个颜色空间。
线性颜色空间比Gamma颜色空间好,效果更真实。但是,有的移动设备和终端不支持线性颜色空间。
一件重要的事情:需要确认目标设备支持哪一个颜色空间。
High Dynamic Range (HDR) 高动态范围
摄像机的配置项。最好是和线性颜色空间一起使用,来正确处理极亮光。
一些移动设备不支持HDR。
Unity默认使用Low Dynamic Range (LDR)。红、绿、蓝分别用8-bit存储,共能表示256 x 256 x 256种不同从黑到白的颜色。16 million种。真实世界的光的颜色远远超过16 million 种,包括不可见光。HDR使用附点数表示光数据,精度更高。
HDR能够更真实的表现明暗对比效果、给粒子或其他可见光源加特效。
反射
Unity 默认使用Standard Shader,它是一个physically-based shader (PBS)。PBS 计算反射时,会考虑物体的物理性质和能量守恒定律。
Unity 可使用反射探针Reflection Probe来预先计算一个cubemap (6面体)保存反射数据,在着色是直接使用保存的数据。
实时反射探针(Realtime Reflection Probes)非常耗cpu, 因为每个探针要计算6次!所以一般使用烘焙反射探针(Baked Reflection Probes)。
光的类型
有向光
点光
射光
区域光