Notifications
Article
关于AlphaTest阴影烘焙后消失的问题
Published 7 months ago
330
1
关于AlphaTest阴影烘焙后消失的问题

前言

Unity内部有很多黑盒,带来方便的同时也意味着如果不遵守它的隐性规则就会容易出错,这不最近碰到了个诡异的问题,如果你发现你的AlphaTest对象明明好好的实时阴影,但是在烘焙后却没有镂空效果,那么你就踩到这个坑了。

解决方法

既然是关于AlphaTest的坑,那Shader中必然用到了clip,假如我们的Shader和效果如下:
Shader "Unlit/AlphaTestBakedShadow" { Properties { _BaseMap ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" sampler2D _BaseMap; fixed4 frag (v2f_img i) : SV_Target { fixed4 col = tex2D(_BaseMap, i.uv); clip(col.a-0.1); return col; } ENDCG } } }
你会发现,在没有烘焙前,树是没有阴影的,但是烘焙后却出现了阴影,虽然阴影效果现在不对,但至少说明烘焙的阴影和Shader中的ShadowCaster这个pass是无关的。
所以需要烘焙有阴影的Shader只需要保证正常的渲染pass即可,但是有几点隐性的规则:
  1. 主纹理名称必须是"_MainTex",只有这个名称才会被内部识别到,就像后处理Shader中也需要用到这个名称是一样的道理。
  2. Shader中的Queue排序在2450-3999之间,也就是"Queue" = "AlphaTest"或者"Queue" = "Transparent".
  3. RenderType设置为"RenderType" = "Transparent"或者"RenderType" = "TransparentCutout".
注:其中2和3只要有一个满足即可!
修改后的正确代码如下(这里采用1和3的组合方式):
Shader "Unlit/AlphaTestBakedShadow" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "Queue" = "Geometry" "RenderType" = "TransparentCutout"} Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; fixed4 frag (v2f_img i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); clip(col.a-0.1); return col; } ENDCG } } }

最后

欢迎大家关注更多干货的公众号:Unity技术美术 ( ID:gh_8b69cca044dc )
Tags:
taecg
TA - Artist
21
Comments
A
Allenxizi
7 months ago
希望大佬能测试一下HDRP Lit材质下的半透明叶子贴图,我这边弄出来是黑色的,嘤嘤~
0