Shader半透明物体的双面渲染

半透明物体的渲染相对不透明物品麻烦一些,需要透过证明能够看清背面的颜色。

双面渲染原理:先渲染背面,再渲染正面,最后把正面和背面颜色混合起来Blend SrcAlpha OneMinusSrcAlpha

1)渲染背面

使用Cull Front剔除正面,并且禁止深度写入Zwrite Offf,开启混合Blend SrcAlpha OneMinusSrcAlpha

2) 渲染正面

使用Cull Back剔除背面,启用混合Blend SrcAlpha OneMinusSrcAlpha

在学习Shader的过程中,或许手头上并没有半透明的物体,在验证shader代码的过程中,我们可以通过添加测试代码把不透明物体当成半透明物体来使用。

Shader "Unlit/Sphere"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType" = "Transparent"  "Queue" = "Transparent" "IgnoreProjector"="True"}
        LOD 100

        Pass
        {
            Tags { "LightModel" = "ForwardBase" }
            Cull Front
            Zwrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            //测试的时候可以设置ColorMask=0来查看正面的颜色
            //ColorMask 0

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct v2f
            {
                float4 pos: SV_POSITION;
                float3 normal: NORMAL;
                float4 vertex: TEXCOORD0;
                float2 uv : TEXCOORD1;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.normal = v.normal;
                o.vertex = v.vertex;
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                float3 normal = UnityObjectToWorldNormal(i.normal);
                normal = normalize(normal);
                float3 l = WorldSpaceLightDir(i.vertex);
                float ndotl = saturate(dot(normal, l));
                fixed4 diffuse = tex2D(_MainTex, i.uv) * _LightColor0 * ndotl;
                fixed4 color = diffuse + unity_AmbientSky;
                //说明:没有半透明的物体时,加上红色来测试
                color = color +fixed4(1, 0, 0, 1); 
                return color;
            }
            ENDCG
        }

        Pass
        {
            Tags { "LightModel" = "ForwardBase" }
            Cull Back
            Blend SrcAlpha OneMinusSrcAlpha
            //测试的时候可以设置ColorMask=0来查看背面的颜色
            //ColorMask 0
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct v2f
            {
                float4 pos: SV_POSITION;
                float3 normal: NORMAL;
                float4 vertex: TEXCOORD0;
                float2 uv : TEXCOORD1;
            };
            
            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _SpecularTex;
            float4 _SpecularTex_ST;
            float _Shininess;

            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.normal = v.normal;
                o.vertex = v.vertex;
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                float3 normal = UnityObjectToWorldNormal(i.normal);
                normal = normalize(normal);
                float3 l = WorldSpaceLightDir(i.vertex);
                float ndotl = saturate(dot(normal, l));
                fixed4 diffuse = tex2D(_MainTex, i.uv) * _LightColor0 * ndotl;
                fixed4 color = diffuse + unity_AmbientSky;
                //说明:没有半透明的物体时,测试设置alpha值
                //color.a = 0.5;
                return color;
            }
            ENDCG
        }
    }
}

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值