饭团鸭 发表于 2023-4-4 17:14:41

怎么让半透明Shader 支持接收阴影

RT

DUO酱 发表于 2023-4-4 17:15:00

要让半透明Shader支持接收阴影,需要在Shader中添加对阴影的处理代码。具体步骤如下:

1. 在Shader中添加对阴影的采样:


half4 shadowColor = tex2D(_ShadowTex, i.uv2);


其中_ShadowTex是引用阴影贴图的变量名,i.uv2是使用阴影贴图的纹理坐标。

2. 根据采样得到的阴影颜色值,将其与半透明的颜色混合:


half4 color = shadowColor * v.color * v.alpha;


其中v.color和v.alpha是取自顶点着色器的颜色和透明度值,用于计算半透明材质的颜色值。

3. 最后,将混合后的颜色值通过输出将其传递给渲染引擎:


o.color = color;


这样就完成了半透明Shader支持阴影的处理。注意,这只是一个基本的处理方法,具体的实现还需要根据场景和需求进行调整和优化。

饭团鸭 发表于 2023-4-4 17:17:36

DUO酱 发表于 2023-4-4 17:15
要让半透明Shader支持接收阴影,需要在Shader中添加对阴影的处理代码。具体步骤如下:

1. 在Shader中添加 ...

我需要一个支持半透明阴影的shader

DUO酱 发表于 2023-4-4 17:18:23

以下是一个支持半透明阴影的Shader代码示例,你可以参考一下:


Shader "Custom/AlphaShadow" {
    Properties {
      // 阴影贴图
      _ShadowTex ("Shadow Texture", 2D) = "white" {}
      // 阴影颜色
      _ShadowColor ("Shadow Color", Color) = (0, 0, 0, 0.5)
    }
    SubShader {
      Tags {"Queue"="Transparent"}
      Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata_t {
                // 顶点坐标
                float4 vertex : POSITION;
                // 纹理坐标
                float2 uv : TEXCOORD0;
                // 用于传递阴影纹理坐标的变量
                float2 uv2 : TEXCOORD1;
            };

            struct v2f {
                // 插值后的纹理坐标
                float2 uv : TEXCOORD0;
                // 插值后的阴影纹理坐标
                float2 uv2 : TEXCOORD1;
                // 插值后的半透明颜色及透明度
                fixed4 color : COLOR;
            };

            sampler2D _MainTex;
            sampler2D _ShadowTex;
            fixed4 _ShadowColor;

            v2f vert (appdata_t v) {
                v2f o;
                // 传递顶点坐标及纹理坐标
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                // 传递阴影纹理坐标
                o.uv2 = v.uv2;
                // 计算顶点的半透明颜色及透明度
                o.color = tex2D(_MainTex, v.uv);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target {
                // 采样阴影贴图
                half4 shadowColor = tex2D(_ShadowTex, i.uv2);
                // 将半透明颜色与阴影颜色混合
                fixed4 color = lerp(i.color, _ShadowColor, shadowColor.a);
                // 输出混合后的颜色
                return color;
            }
            ENDCG
      }
    }
    FallBack "Diffuse"
}


这个Shader有两个属性,一个是阴影贴图,一个是阴影颜色。在顶点着色器中传递了一个额外的变量uv2,用于传递阴影纹理坐标。在片段着色器中先采样阴影贴图,根据采样得到的阴影颜色值和半透明颜色值进行线性插值,得到最终的混合后的颜色输出。

值得注意的是,这个示例Shader仅支持阴影贴图带有透明通道的情况,如果阴影贴图没有透明通道你需要对上面的`lerp`函数进行改写。

提供单独的半透明材质渲染时,需要将渲染队列设置为"Queue"="Transparent"或"Queue"="AlphaTest"。另外,如果你的场景有其他透明物体,则需要控制半透明材质的渲染顺序,避免深度测试问题产生的阴影错误。
页: [1]
查看完整版本: 怎么让半透明Shader 支持接收阴影