写个unity的urp可用的扫描效果shader
时间: 2023-11-09 19:06:11 浏览: 196
以下是一个基于URP(通用渲染管线)的扫描效果Shader示例:
Shader "Custom/ScanEffect" {
Properties {
_ScanTex ("Scan Texture", 2D) = "white" {}
_ScanSpeed ("Scan Speed", Range(0, 10)) = 1
_ScanColor ("Scan Color", Color) = (0, 1, 0, 1)
_ScanWidth ("Scan Width", Range(0, 1)) = 0.1
}
SubShader {
Tags {
"RenderType"="Opaque"
"Queue"="Geometry"
}
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 _ScanTex;
float _ScanSpeed;
float4 _ScanColor;
float _ScanWidth;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target {
float scanline = tex2D(_ScanTex, i.uv).r;
float scanpos = _Time.y * _ScanSpeed - i.uv.y;
float scan = smoothstep(_ScanWidth, _ScanWidth + 0.01, scanline) * step(0, scanpos);
return lerp(_ScanColor, tex2D(_MainTex, i.uv), scan);
}
ENDCG
}
}
FallBack "Diffuse"
}
这个Shader有四个属性:
- _ScanTex:扫描线纹理
- _ScanSpeed:扫描速度
- _ScanColor:扫描线颜色
- _ScanWidth:扫描线宽度
在Pass中,首先定义了两个结构体appdata和v2f,分别用于传递输入数据和输出数据。然后定义了四个属性,其中_ScanTex使用了2D纹理类型,其他三个属性分别是一个Range类型、一个Color类型和一个Range类型。
在vert函数中,将输入数据转换为输出数据。在frag函数中,首先获取扫描线的值,并计算扫描线位置和扫描线强度。最后,使用lerp函数将扫描线颜色和原始颜色混合起来,达到扫描效果。
使用这个Shader时,只需要将它附加到需要扫描效果的材质上,并设置相应的属性即可。
阅读全文