第9章
- 渲染路径:前向渲染和延迟渲染。
- 前向渲染:
- ForwardBase,计算环境光,最重要的环境光,逐顶点/SH光源(球谐函数)和Lightmaps
- ForwardAdd,计算逐像素光源
- 光照衰减
- 需要引入"AutoLight.cginc"文件才能使用_LightMatrix0和_LightTexture0
- 需要使用编译指令 pragma multi_compile_fwdadd
- _LightMatrix0(也可写unity_WorldToLight)将世界空间转换为光源空间
- _LightTexture0 光源衰减纹理
- .rr是swizzling操作,将点乘的结果变成一个二维向量
乘以UNITY_ATTEN_CHANNEL的目的是求取rgba其中一个分量,
因为tex2D函数的结果是一个fixed4类型颜色
float 3 lightCoord = mul(_LightMatrix0,float4(i.worldPosition,1)).xyz; fixed atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr) .UNITY_ATTEN_CHANNEL
- 向量重组(Swizzling)
- A = {1,2,3,4},若B = A.wwxy,则B = {4,4,1,2}
- 阴影
- 阴影映射原理
- CastShadows 为On 开启向其它物体投射阴影
- Receive Shadows 接收其它物体的阴影
- 让物体投射阴影:使用自带的Fallback如"Specular",因为它们带有 LightMode = ShadowCaster 的Pass
- 让物体接收阴影:
- 在顶点着色器输出结构v2f定义 SHADOW_COORDS(index)没有分号,index是可用的插值寄存器的索引值(即下一个可用的TEXCOORD后面的数字)。这一步的目的是定义对阴影纹理采样的坐标
- 在顶点着色器使用TRANSFER_SHADOW(o)。这一步的目的是计算上一步的阴影纹理坐标
- 在片元着色器中计算阴影值。
fixed shadow = SHADOW_ATTENUATION(i);
- 将光照衰减和阴影一起计算
- 在顶点着色器输出结构v2f定义 SHADOW_COORDS(index)没有分号,index是可用的插值寄存器的索引值(即下一个可用的TEXCOORD后面的数字)。这一步的目的是定义对阴影纹理采样的坐标
- 在顶点着色器使用TRANSFER_SHADOW(o)。这一步的目的是计算上一步的阴影纹理坐标
- 在两个Pass的片元着色器中使用UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos) 其中的atten不需要定义
- 对于透明度测试的物体开启投射阴影需要将Fallback设置为 "Transparent/Cutout/VertexLit"
- 对于透明度混合的物体阴影比较复杂,UNITY内置的shader不支持
网友评论