unity3d shader BIllboard 使模型始终朝向摄像机

修改unity 内置shader Particles/Additive 为增加 BIllboard功能
上代码

Shader "Particles/AddtiveBillboard" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture", 2D) = "white" {}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }

    SubShader {
        Pass {

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_particles

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;

            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };

            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                //o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);//这里是原有的vertex 赋值代码,注释掉
                //****************这里修改的vertex赋值代码*******************
                float4 ori=mul(UNITY_MATRIX_MV,float4(0,0,0,1));
                float4 vt=v.vertex;
                vt.y=vt.z;
                vt.z=0;
                vt.xyz+=ori.xyz;
                o.vertex=mul(UNITY_MATRIX_P,vt);
                //******************************
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D_float _CameraDepthTexture;
            float _InvFade;

            fixed4 frag (v2f i) : SV_Target
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif

                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }   
}
}

猜你喜欢

转载自blog.csdn.net/qqo_aa/article/details/78795813