在URP下默认只有不透明才会有阴影,其实可以使用alpha test给shadowmap上画阴影, 物体本身则使用alpha blend这样也更加合理。
首先拷贝一下默认的Lit.shader,在Properties中添加一个Toggle变量来控制是否开启半透明阴影。
1 2 3 4 5 6 7 8 9 10 |
Properties { //.... [Toggle]_TShadow("TShadow", Float) = 0 } //.... CustomEditor "MyLitShader" |
在写一个shader面板,继承默认的BaseShaderGUI
1 2 3 4 5 6 7 8 9 |
private MaterialProperty tShadow; public override void FindProperties(MaterialProperty[] properties) { base.FindProperties(properties); litProperties = new LitGUI.LitProperties(properties); tShadow = BaseShaderGUI.FindProperty("_TShadow", properties, false); } |
根据Toggle决定是否启动半透明阴影
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public override void DrawSurfaceInputs(Material material) { base.DrawSurfaceInputs(material); LitGUI.Inputs(litProperties, materialEditor, material); DrawEmissionProperties(material, true); DrawTileOffset(materialEditor, baseMapProp); //绘制半透明阴影 SurfaceType surfaceType = (SurfaceType)material.GetFloat("_Surface"); if(surfaceType == SurfaceType.Transparent) { materialEditor.ShaderProperty(tShadow, "半透明阴影"); material.SetShaderPassEnabled("ShadowCaster", (material.GetFloat("_TShadow") == 1.0)); } else { material.SetShaderPassEnabled("ShadowCaster", true); } } |
然后在面板中启动半透明阴影,如下图所示,启动半透明阴影,然后是Alpha Clipping,通过观察URP源码发现,如果不想影响到半透明渲染,只给阴影生效,也可以自己拓展一个Threshold变量在ShadowCaster中使用alpha Test,这里就关闭面板上的alpha clipping。
最终半透明物体可以产生阴影了。
- 本文固定链接: https://www.xuanyusong.com/archives/4868
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
大佬在2020 2021测试,会出现有阴影,但是物体透明了
大佬在2020 2021测试,会出现有阴影,但是物体全透明了,调整透明度有没有用