解说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,从而实现刀光的循环效果。

作者信息

menghao

menghao

共发布了 3994 篇文章