Unity3d Shader不会使alpha通道的颜色生效

时间:2016-10-01 14:28:15

标签: unity3d shader shaderlab

所以我设法将这个着色器组合在一起,该着色器将渲染一个对象的轮廓,并以一定的透明度渲染对象的其余部分。这是整个代码:

Shader "Outlined/Outline with transperancy" {
    Properties {
        _OutlineColor ("Outline Color1", Color) = (0,0,0,1)
        _Outline ("Outline width", Range (0.0, 0.3)) = .005
        _MainTex ("Maintexture", 2D) = "white" {}
        _Color("Main Color",Color) = (0,0,0,0)
    }

CGINCLUDE
#include "UnityCG.cginc"

struct appdata {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
};

struct v2f {
    float4 pos : POSITION;
    float4 color : COLOR;

};
struct v2ft

{

    float4  pos : SV_POSITION;

    float2  uv : TEXCOORD0;

};
uniform float _Outline;
uniform float4 _OutlineColor;
uniform float4 _Color;
v2f vert(appdata v) {
    // just make a copy of incoming vertex data but scaled according to normal direction
    v2f o;
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

    float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
    float2 offset = TransformViewToProjection(norm.xy);

    o.pos.xy += offset * o.pos.z * _Outline;
    o.color = _OutlineColor;
    o.color.w = _Color.w;
    return o;
}
ENDCG

    SubShader {
    Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
    LOD 200
        Pass {
            Name "BASE"
            Cull Back
            Blend Zero One

            // uncomment this to hide inner details:
            //Offset -8, -8

            SetTexture [_OutlineColor] {
                ConstantColor (0,0,0,0)
                Combine constant
            }
        }

        // note that a vertex shader is specified here but its using the one above
        Pass {
            Name "OUTLINE"
            Tags { "LightMode" = "Always" }
            Cull Front

            // you can choose what kind of blending mode you want for the outline
            //Blend SrcAlpha OneMinusSrcAlpha // Normal
            Blend One One // Additive
            //Blend One OneMinusDstColor // Soft Additive
            //Blend DstColor Zero // Multiplicative
            //Blend DstColor SrcColor // 2x Multiplicative

CGPROGRAM
#pragma vertex vert
#pragma fragment frag

half4 frag(v2f i) :COLOR {
    return i.color;
}
ENDCG
        }
        Pass{
        Name "Transperancy"
    CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            #pragma multi_compile_builtin

            #pragma fragmentoption ARB_precision_hint_fastest



            #include "UnityCG.cginc"


            v2ft vert(appdata_base v)

            {

                v2ft o;

                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

                o.uv = v.texcoord.xy;

                return o;

            }



            sampler2D _MainTex;

            //float4 _Color;



            fixed4 frag(v2ft i) : COLOR

            {

                fixed4 result = tex2D(_MainTex, i.uv) * _Color;
                return result;

            }

    ENDCG

}

    }

    Fallback "Diffuse"
}

这一切都很有效,只是在最后一次传递中为主要纹理着色的颜色的alpha根本没有效果。色调本身有效。

1 个答案:

答案 0 :(得分:0)

使用以下内容替换透明度通道:

modelserializer