0

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

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 完全没有影响之外,这一切都很好。色调本身有效。

4

1 回答 1

0

将透明通行证替换为以下内容:

        Pass{
    ZWrite On
    Blend SrcAlpha OneMinusSrcAlpha
    ColorMask RGB
    Material{
    Diffuse[_Color]
    Ambient[_Color]
}
Lighting On
SetTexture[_MainTex]{
    Combine texture * primary DOUBLE, texture * primary
}
}
于 2016-10-01T16:53:00.657 回答