Unity3D

来源:互联网 发布:怎么下载淘宝号 编辑:程序博客网 时间:2024/06/05 18:26

透明度测试:只要有一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元不会再进行任何处理,也不会对颜色缓冲区产生任何影响。否则就会按照普通物体进行处理。

通常使用clip函数进行透明度测试,如果给定的参数任何一个分量是负数,就会舍弃当前像素的输出颜色:

void clip(float4 x);void clip(float3 x);void clip(float2 x);void clip(float1 x);void clip(float x);==== 等同于void clip(float4 x) {    if (any(x) < 0) {        discard;    }}

具体代码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 8/Alpha Test" {    Properties {        _Color ("Main Tint", Color) = (1,1,1,1)        _MainTex ("Main Tex", 2D) = "white" {}        // 用于使用clip进行透明度测试时使用的判断条件。        _Cutoff ("Alpha Cutoff", Range(0,1 )) = 0.5    }    SubShader {        // Queue用于指定渲染队列        // RenderType让Unity把这个Shader归入到提前定的组(TransparentCutout组),以指明该Shader是一个使用了透明度测试的Shader        // IgnoreProjector=true意味着该Shader不会受到投影器(Projectors)的影响        Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }        Pass {            // 定义该Pass在Unity中的光照流水线中的角色            Tags { "LightMode"="ForwardBase" }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "Lighting.cginc"            fixed4 _Color;            sampler2D _MainTex;            float4 _MainTex_ST;            fixed _Cutoff;            struct a2v {                float4 vertex : POSITION;                float3 normal : NORMAL;                float4 texcoord : TEXCOORD0;            };            struct v2f {                float4 pos : SV_POSITION;                float3 worldNormal : TEXCOORD0;                float3 worldPos : TEXCOORD1;                float2 uv : TEXCOORD2;            };            v2f vert(a2v v) {                v2f o;                o.pos = UnityObjectToClipPos(v.vertex);                o.worldNormal = UnityObjectToWorldNormal(v.normal);                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);                return o;            }            fixed4 frag(v2f i) : SV_Target {                fixed3 worldNormal = normalize(i.worldNormal);                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));                fixed4 texColor = tex2D(_MainTex, i.uv);                // AlphaTest                clip(texColor.a - _Cutoff);                fixed3 albedo = texColor.rgb * _Color.rgb;                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;                fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));                return fixed4 (ambient + diffuse , 1.0);            }            ENDCG        }    }    FallBack "Transparent/Cutout/VertexLit"}
原创粉丝点击