美文网首页
Shader入门精要笔记9

Shader入门精要笔记9

作者: 水曜日鶏 | 来源:发表于2020-01-12 12:07 被阅读0次

第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不支持

相关文章

网友评论

      本文标题:Shader入门精要笔记9

      本文链接:https://www.haomeiwen.com/subject/mbviactx.html