UnityShader案例(九)——透明效果(2)

来源:互联网 发布:网络私募 编辑:程序博客网 时间:2024/06/05 11:17

一、原理

透明度混合:这种方法可以得到 真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是,透明度混合需要关闭深度写入。透明度混合只是关闭了深度写入,但并没有关闭深度测试。

二、实现

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "Custom/Transparent/AlphaBlend"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _Color("Color",Color)=(1,1,1,1)        _Cutoff("AlphaBlend",Range(0,1))=1    }    SubShader    {        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }        LOD 100        Pass        {            Tags{"LightMode"="ForwardBase"}            ZWrite off            Blend SrcAlpha OneMinusSrcAlpha            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            #include "Lighting.cginc"            sampler2D _MainTex;            fixed4 _Color;            float4 _MainTex_ST;            fixed _Cutoff;            struct appdata            {                float4 vertex : POSITION;                float4 uv : TEXCOORD0;                float3 normal:NORMAL;            };            struct v2f            {                float2 uv : TEXCOORD0;                float3 worldNormal:TEXCOORD1;                float3 worldPos:TEXCOORD2;                float4 vertex : SV_POSITION;            };            v2f vert (appdata v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                o.worldNormal=UnityObjectToWorldNormal(v.normal);                o.worldPos=mul(unity_ObjectToWorld,v.vertex);                o.uv = TRANSFORM_TEX(v.uv, _MainTex);                return o;            }            fixed4 frag (v2f i) : SV_Target            {                float3 worldNormal=normalize(i.worldNormal);                float3 worldLightDir=normalize(UnityWorldSpaceLightDir(i.worldPos));                fixed4 col = tex2D(_MainTex, i.uv);                fixed3 albedo=col.rgb*_Color.rgb;                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;                fixed3 diffuse=_LightColor0.rgb*albedo*max(0,dot(worldNormal,worldLightDir));                return fixed4(ambient+diffuse,col.a *_Cutoff);                return col;            }            ENDCG        }    }}

这里写图片描述

阅读全文
0 0