最近我一直在尝试着做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
}
}
}
网格使用的材料应用。
先谢谢你,如果你有什么不明白的地方,请拿来给我,我可以试着解释得更好。
非常感谢!!!!!!!!!!!!。
关于你的第一个问题:在第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
就像我说过的,我没有测试过这个,你最喜欢的是需要添加一些偏移量。如果你有困难,我可以给你一个运行的例子。