解说unity3d刀光剑影(二)
2015年03月20日 11:01
0 点赞
0 评论
更新于 2025-11-21 17:48
本篇将深入研究《暴走武侠》的刀光效果,下面直接给出实现该效果的Shader代码。
Shader "Cg shader with single texture" {
Properties {
_MainTex ("Texture Image", 2D) = "white" {}
_MainTex1 ("Texture Image", 2D) = "white" {}
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform sampler2D _MainTex;
uniform sampler2D _MainTex1;
struct vertexInput {
// 根据最近对移动平台的性能研究,建议一般用fixed类型
fixed4 vertex : POSITION;
fixed4 texcoord : TEXCOORD0;
fixed4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
};
struct vertexOutput {
fixed4 pos : SV_POSITION;
fixed4 tex : TEXCOORD0;
fixed4 tex1 : TEXCOORD1;
fixed4 col : COLOR;
};
vertexOutput vert(vertexInput input) {
vertexOutput output;
output.tex = mul(UNITY_MATRIX_TEXTURE0, input.texcoord).xyzw;
output.tex1 = input.texcoord1;
output.col = input.color;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
fixed4 frag(vertexOutput input) : COLOR {
fixed4 color1 = input.col;
{
fixed4 texture1 = tex2D(_MainTex, fixed2(input.tex));
color1 = texture1.rgba;
}
{
fixed4 texture2 = tex2D(_MainTex1, fixed2(input.tex1));
color1.rgb = texture2.rgb + color1.rgb;
color1.a = texture2.a;
}
// 采用这种方式实现透明效果
if (color1.a <= 0.01) {
discard;
}
return color1;
}
ENDCG
}
}
}
代码解释
- Properties部分:定义了两个纹理属性
_MainTex和_MainTex1,用于后续的纹理采样。 - SubShader部分:包含一个Pass,在这个Pass中使用CG语言编写顶点着色器和片段着色器。
- 顶点着色器
vert:对顶点的位置、纹理坐标和颜色进行处理,并将处理后的结果传递给片段着色器。 - 片段着色器
frag:进行纹理采样,将两个纹理的颜色进行混合,并通过判断透明度实现透明效果。
效果图
这里会展示实现的刀光效果的具体图片(由于无法直接展示,你可以在实际运行代码后查看效果)。
控制刀光频率
若要控制刀光的频率,需要在C#脚本中添加如下代码:
void Update () {
t += Time.deltaTime;
renderer.material.SetTextureOffset("_MainTex", new Vector2(1 - t, 0));
if (t >= 1) {
t = 0;
}
}
这段代码通过不断更新纹理的偏移量来控制刀光的频率,当偏移量达到1时,将其重置为0,从而实现刀光的循环效果。