Unity Shader中的不透明度

时间:2017-09-28 20:57:22

标签: unity3d shader

我正在尝试制作一个模拟经线速度效果的着色器,我认为差不多完成了,只需要知道我应该在代码中更改什么来使隧道效果完全不透明而且看不到隧道后面的任何东西效果。

我添加了一个alpha滑块,看看我是否可以控制不透明度,但结果仍然是相同的结果。

代码在这里:

Shader "Warp Tunnel Distortion Opaque" {
Properties {
_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)

_Speed("UV Speed", Float) = 1.0
_WiggleX("_WiggleX", Float) = 1.0
_WiggleY("_WiggleY", Float) = 1.0
_WiggleDist("Wiggle distance", Float) = 1.0

_Offset("Vertex offset", float) = 0

_TintColor("Tint", Color) = (1.0, 1.0, 1.0, 1.0)

_MainTex("Distortion map", 2D) = "" {}
_Dist("Distortion ammount", Float) = 10.0   

}

Category {
        Tags { "Queue"="Geometry" "RenderType"="Opaque" }
Cull Back Lighting Off ZWrite Off 
Fog { Color (0,0,0,0) }
ZTest LEqual

SubShader {


GrabPass {
        Name "BASE"
        Tags { "LightMode" = "Always" }
    }

    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;
            float4 normal : NORMAL;
        };

        struct v2f {
            float4 vertex : SV_POSITION;
            fixed4 color : COLOR;
            float2 texcoord : TEXCOORD0;
            float4 posWorld : TEXCOORD1;
            float4 uvgrab : TEXCOORD2;  
            float4 projPos : TEXCOORD3;

        };

        float4 _MainTex_ST;
        float _Speed;

        float _WiggleX, _WiggleY, _WiggleDist;
        float _Offset;
        float _Dist;

        sampler2D _CameraDepthTexture;
    float _InvFade;

    sampler2D _GrabTexture;
    float4 _GrabTexture_TexelSize;

        v2f vert (appdata_t v)
        {
            v2f o;
            o.posWorld = mul(unity_ObjectToWorld, v.vertex);
            v.vertex.xyz += normalize(v.normal.xyz) * _Offset;
            o.vertex = UnityObjectToClipPos(v.vertex);  
            o.vertex.x += sin(_Time.y * _WiggleX) * _WiggleDist;    
            o.vertex.y -= sin(_Time.y * _WiggleY) * _WiggleDist;        
            o.color = v.color;
            o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);

            o.projPos = ComputeScreenPos (o.vertex);
            COMPUTE_EYEDEPTH(o.projPos.z);


            #if UNITY_UV_STARTS_AT_TOP
                float scale = -1.0;
            #else
                float scale = 1.0;
            #endif

            o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
            o.uvgrab.zw = o.vertex.zw;

            return o;
        }



        fixed4 frag (v2f i) : SV_Target
        {

            i.texcoord.y += _Time.x * _Speed;

            float4 packedTex = tex2D(_MainTex, i.texcoord);

            float local1 = packedTex.z * 2.4;
            float2 local2 = packedTex.rg * 2.25;

            packedTex.rg = local1 * local2;

            half2 bump = UnpackNormal(packedTex).rg; 
            float2 offset = bump * _Dist * _GrabTexture_TexelSize.xy;
            i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;

            half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab));   

            return col;
        }
        ENDCG 
    }
}   
}
}

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果你想要它完全不透明,那很容易。

在return语句之前,只需添加:

col.a = 1;

如果您希望它实际上关注关于输入颜色中的Alpha滑块,请执行以下操作:

col.a = _TintColor.a;

在第一种情况下,_TintColor根本没有使用(除了声明之外没有其他引用,其中顶部有2个(你应该删除其中一个)和CGprogram块中的一个将第一个链接到可以在CG程序中使用的属性。

如果你真的想要染色,你必须将_TintColor与来自纹理和效果的计算颜色相乘。有多种方法可以做到这一点,例如:

col.r *= _TintColor.r;
col.g *= _TintColor.g;
col.b *= _TintColor.b;

您希望如何处理它取决于您。