unity中使用shader实现流光效果

2017年04月20日 17:14 0 点赞 0 评论 更新于 2025-11-21 21:23

一、流光效果的应用原因

在许多项目中,流光效果颇受青睐。从实现成本的角度来看,其成本较低。仅需一张流光图、一张过滤图,通过一个渲染遍数,就能够实现流光效果,并且该效果在完成后往往很受欢迎。接下来,将详细介绍如何使用Shader制作流光效果。

二、使用Shader制作流光效果

1. 代码实现及原理

通过一些简单的效果示例,能帮助我们更好地理解Shader。以下是具体的代码,代码中的注释会详细解释每一步的作用:

Shader "Unlit/MoveLightImage"
{
// 属性部分,定义在材质面板中可调整的参数
Properties
{
// 主纹理
_MainTex ("Texture", 2D) = "white" {}
// 灯光纹理
_LightTex("Light Texture", 2D) = "white" {}
// 遮罩纹理
_MaskTex("Mask Texture", 2D) = "white" {}
}
SubShader
{
// 标签设置,指定渲染队列和渲染类型为透明
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" }
// 层级细节设置
LOD 100
// 透明混合模式,实现透明效果
Blend SrcAlpha OneMinusSrcAlpha

Pass
{
CGPROGRAM
// 指定顶点着色器函数
#pragma vertex vert
// 指定片段着色器函数
#pragma fragment frag
// 开启雾效支持
#pragma multi_compile_fog

#include "UnityCG.cginc"

// 定义输入到顶点着色器的数据结构
struct appdata
{
float4 vertex : POSITION; // 顶点位置
float2 uv : TEXCOORD0;    // 纹理坐标
};

// 定义从顶点着色器输出到片段着色器的数据结构
struct v2f
{
float2 uv : TEXCOORD0;    // 纹理坐标
UNITY_FOG_COORDS(1)       // 雾效坐标
float4 vertex : SV_POSITION; // 裁剪空间顶点位置
};

// 声明纹理采样器
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _LightTex;
sampler2D _MaskTex;
fixed4 _Color;

// 顶点着色器函数
v2f vert (appdata v)
{
v2f o;
// 将顶点从模型空间转换到裁剪空间
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
// 对纹理坐标进行变换
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
// 传递雾效坐标
UNITY_TRANSFER_FOG(o, o.vertex);
return o;
}

// 片段着色器函数
fixed4 frag (v2f i) : SV_Target
{
// 灯光贴图取一半UV
float2 uv = i.uv * 0.5;
// 不断改变uv的x轴,让其往x轴方向移动,_Time为Shader的时间函数,会一直执行
uv.x += -_Time.y * 0.4;
// 取灯光贴图的alpha值,黑色为0,白色为1
fixed lightTexA = tex2D(_LightTex, uv).a;
// 获取遮罩贴图的alpha值,黑色为0,白色为1,这里的uv和上面的uv是调用的不一样的函数
fixed maskA = tex2D(_MaskTex, i.uv).a;

// 主纹理 + 灯光贴图 * 遮罩贴图,简单原理:任何数 * 0 为 0,这样就避免了遮罩外出现不协调灯光贴图
fixed4 col = tex2D(_MainTex, i.uv) + lightTexA * maskA * 0.6;
// 应用雾效
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}

代码解释:

  • Properties部分:定义了三个纹理属性,分别为主纹理_MainTex、灯光纹理_LightTex和遮罩纹理_MaskTex,这些属性可以在材质面板中进行设置。
  • SubShader部分:设置了渲染队列和渲染类型为透明,使用Blend SrcAlpha OneMinusSrcAlpha实现透明混合效果。
  • Pass部分:包含顶点着色器和片段着色器。
  • 顶点着色器vert:将顶点从模型空间转换到裁剪空间,并对纹理坐标进行变换,同时传递雾效坐标。
  • 片段着色器frag
  • 对灯光贴图的UV进行处理,使其在x轴方向移动,实现流光效果。
  • 分别获取灯光贴图和遮罩贴图的alpha值。
  • 通过主纹理加上灯光贴图与遮罩贴图的alpha值的乘积,避免遮罩外出现不协调的灯光贴图。
  • 最后应用雾效并返回最终颜色。

2. 材质参数

在Unity中创建一个新的材质,将Shader设置为Unlit/MoveLightImage,然后在材质面板中可以调整_MainTex_LightTex_MaskTex这三个纹理,以实现不同的流光效果。

3. 效果展示

将设置好的材质应用到相应的模型或对象上,运行Unity项目,即可看到流光效果。通过调整代码中的参数,如流光移动的速度(_Time.y * 0.4中的0.4)和灯光强度(lightTexA * maskA * 0.6中的0.6),可以进一步优化流光效果。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章