1.Include Files
2.The Second Light
3.Point Light
1.Include Files
为了在着色器中实现多光源支持, 我们需要添加更多通道; 这些通道会包含几乎相同的代码, 为了避免代码重复, 我们将着色器代码移到一个包含文件中; 与光照着色器相同的文件夹中创建一个后缀为.cginc的文件, 将光照着色器中从#pragma语句下方开始直到ENDCG
#include 文本替换, 将内容替换该文件中的shader代码
当我们的文件中包含了多个相同的其他文件时, 最终导致代码重复; 为了防止代码重复, 通常通过#define会对头文件进行定义检查保护, 这个定义只是一个与头文件名对应的唯一标识符
2.The Second Light
添加第二个光源, 该光源再次采用平行光, 进行如下设置:
虽然我们有两个平行光源, 但是视觉上并无差异; 两者同时激活时, 只有主光源才会产生实际影响
我们只能看到单一光源的影响, 是因为我们的shader设置的基础渲染通道, 基础渲染通道用于处理定向光; 如果要处理额外光源, 则需要添加一个附加渲染通道
现在我们看到的效果是第二个灯光生效, 想要的效果是第一个灯和第二个灯的叠加, 需要修改混合模式为Blend One One
由于第一个pass和第二个是对于相同的物体使用, 第一个pass已经将物体相关的深度写进深度缓冲区中, 因此第二个pass中我们无需再次写入Zwrite Off
3.Point Light
我们加入点光源, 关闭两个方向光源
1).Light Positon 光源位置a.对于方向光, _WorldSpaceLightPos0表示的是光线的方向b.对于点光源, _WorldSpaceLightPos0表示点光源的位置, 计算光线的方向需要用点光源的位置减去片元的世界坐标
2).Light Attenuation 光线衰减a.对于方向光而言, 知道其方向就足够, 它被假定位于无限远处b.对于点光源而言, 它具有明确位置, 它与物体表面的距离也会产生影响; 光线距离物体越远, 亮度就越弱, 这种现象被称为光线衰减c.对于平行光源, 其衰减变化极其缓慢, 可视为恒定值, 无需特别处理; 但点光源的衰减是如何的?想象一个点向所有方向瞬间发射出光子, 这些光子以相同速度向外移动, 随着时间的推移, 它们与中心点的距离不断增加; 这些光子构成了一个以该点为中心的球面, 随着光子持续运动, 这个球体的半径不断扩大; 球体表面积随之增长, 但包含的光子总数保持不变, 因此光子密度逐渐降低 - 这决定了我们观测到的光线亮度
3).光源衰减因子半径为r的球体表面积公式为4πr^2, 为计算光子密度, 可用该值作为分母, 常数项4π可以忽略不计, 最终得到的衰减系数为1/d^2, 其中d表示光源距离
上面计算光照衰减因子1 / d^2存在一个问题, 当光源到物体表面的距离趋近于零时, 衰减因子会急剧增至无限大; 为了确保光线在零距离时强度达到最大值, 需将衰减方程修改为:1 / (1 + d^2)