Unity - 粒子效果。如何让Shader在所需时间内播放?

问题描述 投票:0回答:1

最近我一直在尝试着做VFX。我遇到了我非常喜欢的效果,滚动着色器。

我的基础是 此职位 并设法与它的创作者取得了联系,所以向他致敬,他指导我在正确的方向上达到了预期的效果。

后来,我发现自己有一些错误,如果有人能帮我解决,我将非常感激。

这个效果简单来说就是纹理在某个网格中滚动,用alpha纹理遮挡。

第一个问题。这个效果没有颜色... 它可以旋转,阿尔法遮罩也固定了,但是颜色不显示。

第二个问题。我使用这个着色器来完成一个效果的特定部分,使用粒子系统。我使用了 "Color Over Lifetime "选项,但整个效果一开始,它还是会激活。使用Start Delay选项,它可以工作。

在某种程度上,这个问题是固定的,尽管我想知道我如何能像Color Over Lifetime那样慢慢出现。

最后一个问题,因为在更多的奖金。

有没有一种方法可以让网格慢慢出现,与着色器效果一起,从下到上?

当前的着色器代码

Shader "Custom/ScrollingShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _AlphaMaskTex ("AlphaMask", 2D) = "white" {}
        _ScrollSpd ("Scroll Speeds", vector) = (-5, -20, 0, 0)
        [HDR] _Color ("Color", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        // No culling or depth
        Cull back ZWrite Off ZTest Always Blend SrcAlpha OneMinusSrcAlpha


        Pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float2 alphauv : TEXCOORD1;
                float4 vertex : SV_POSITION;
            };

            float4 _MainTex_ST;
            float4 _AlphaMaskTex_ST;
            float4 _ScrollSpd;

            v2f vert (appdata v)
            {                
                /* v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex).xy + frac(_Time.y * float2(_ScrollSpd.x, _ScrollSpd.y));
                return o; */

                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex).xy + frac(_Time.y * float2(_ScrollSpd.x, _ScrollSpd.y));

                o.alphauv = TRANSFORM_TEX(v.uv, _AlphaMaskTex).xy;

                return o;
            }

            sampler2D _MainTex;
            sampler2D _AlphaMaskTex;
            float4 _Color;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                fixed4 colA = tex2D(_AlphaMaskTex, i.alphauv);

                col = tex2D(_MainTex, i.uv) * _Color;

                col.a = tex2D(_AlphaMaskTex, i.uv).r;

                col = tex2D(_MainTex, i.uv) * tex2D(_AlphaMaskTex, i.alphauv).r;

                return col;
            }
            ENDCG
        }
    }
}

网格使用的材料应用。

enter image description here

先谢谢你,如果你有什么不明白的地方,请拿来给我,我可以试着解释得更好。

非常感谢!!!!!!!!!!!!。

c# unity3d shader particle-system
1个回答
1
投票

关于你的第一个问题:在第68行

col = tex2D(_MainTex, i.uv) * _Color;

你试图通过将纹理与你的颜色相乘来设置颜色。

col = tex2D(_MainTex, i.uv) * tex2D(_AlphaMaskTex, i.alphauv).r。

你只是在覆盖你现有的颜色值。所以只要你的基础纹理是灰度的,效果中就不会有颜色。我猜你想要的是这样的效果。

col = tex2D(_MainTex, i.uv) * _Color;
//col.a = tex2D(_AlphaMaskTex, i.alphauv).r; //<-- Edit1
col.a = tex2D(_AlphaMaskTex, i.alphauv).r * _Color.a; //<-- Edit2 fade in

关于你的第二个问题 我不太明白你想达到什么目的。我也不是粒子系统的专家。但只要你在绘制你的粒子,shader就会被执行,通过引用_时间,它就会被动画化。寿命中的颜色可以作为你的着色器的输入。所以你可以用这个值来改变你的着色器行为。你可以做各种有趣的事情,例如,如果你想在一段时间后开始动画粒子,你可以设置color over lifetime从0 alpha混合到1 alpha,然后你检查shader中的alpha值,如果它大于0.5,你就开始动画你的vs。color over lifetime功能似乎是一个很好的方式来传递数据到你的shader。

不幸的是,我并不真正理解你想要达到的目的,所以我无法提供更多帮助。也许你可以详细说明一下你的第二个问题?

关于你的第三个问题。

这是完全可能的 在你的片段着色器中,你可以将uv视为从下到上、从左到右的梯度。因此,如果你把uv.y乘以alpha颜色,你将会混合你的粒子。现在你可以用你从color over time函数中得到的颜色来做动画。我还没试过,但你可以做这样的事情。

col.a = clamp(col.a * i.uv.y + _Color.a, 0.0f, 1.0f); //<- Edit

就像我说过的,我没有测试过这个,你最喜欢的是需要添加一些偏移量。如果你有困难,我可以给你一个运行的例子。

© www.soinside.com 2019 - 2024. All rights reserved.