【问题标题】:Opacity in Unity ShaderUnity Shader 中的不透明度
【发布时间】:2017-10-01 01:58:16
【问题描述】:

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

我添加了一个 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 
    }
}   
}
}

提前谢谢你。

【问题讨论】:

    标签: unity3d shader


    【解决方案1】:

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

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

    col.a = 1;
    

    如果您希望它真正关心输入颜色中的 alpha 滑块,请执行以下操作:

    col.a = _TintColor.a;
    

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

    如果你真的想给事物着色,你必须将_TintColor 与来自纹理和效果的计算颜色相乘。有多种方法,例如:

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

    你想如何处理它取决于你。

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 2019-01-02
      • 2016-02-15
      • 1970-01-01
      • 2016-10-12
      • 2014-01-05
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多