使用shaderlab写一个基于spriterender的动态扩散shader
时间: 2024-05-02 11:17:50 浏览: 117
以下是使用shaderlab编写的基于spriterender的动态扩散shader:
```
Shader "Custom/DynamicDiffusion" {
Properties {
_MainTex("Base (RGB)", 2D) = "white" {}
_DiffusionSize("Diffusion Size", Range(0.01, 1.0)) = 0.1
_DiffusionSpeed("Diffusion Speed", Range(0.01, 1.0)) = 0.1
_DiffusionColor("Diffusion Color", Color) = (1, 1, 1, 1)
}
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Transparent"}
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;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float _DiffusionSize;
float _DiffusionSpeed;
float4 _DiffusionColor;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
float center = 0.5;
float distance = distance(i.uv, float2(center, center));
float diffusion = smoothstep(center - _DiffusionSize, center, distance);
float time = _Time.y * _DiffusionSpeed;
float2 offset = _DiffusionColor.rg * (diffusion * sin(time) + (1 - diffusion) * cos(time));
float2 distortionUV = i.uv + offset;
col += tex2D(_MainTex, distortionUV) * _DiffusionColor.rgb;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
```
该shader包含以下属性:
- _MainTex:Sprite的纹理贴图
- _DiffusionSize:扩散效果的大小
- _DiffusionSpeed:扩散效果的速度
- _DiffusionColor:扩散效果的颜色
在顶点着色器中,使用UnityObjectToClipPos函数将顶点位置从对象空间转换为剪辑空间。
在片段着色器中,使用tex2D函数获取纹理贴图的颜色值。通过计算距离中心点的距离,使用smoothstep函数创建扩散效果。使用sin和cos函数创建动态扭曲效果。将扩散效果和动态扭曲效果结合,使用tex2D函数获取扭曲后的纹理颜色值,最后将其与DiffusionColor相乘,得到最终的颜色值。
可以在Shader Inspector窗口中调整DiffusionSize、DiffusionSpeed和DiffusionColor的值,以达到所需的效果。
阅读全文