121 lines
3.7 KiB
Plaintext
121 lines
3.7 KiB
Plaintext
Shader "IndianOcean/PortalVortex"
|
|
{
|
|
// 传送门旋涡 Shader
|
|
// 顺时针旋转 + 中心扭曲 + 发光效果
|
|
// 基于 URP 管线
|
|
Properties
|
|
{
|
|
_MainTex ("主贴图", 2D) = "white" {}
|
|
_RotationSpeed ("旋转速度", Range(-5.0, 5.0)) = 1.5
|
|
_VortexStrength ("扭曲强度", Range(0.0, 3.0)) = 1.0
|
|
_CenterGlow ("中心发光强度", Range(0.0, 3.0)) = 1.5
|
|
_Color ("色调", Color) = (1.0, 1.0, 1.0, 1.0)
|
|
}
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"RenderType" = "Transparent"
|
|
"Queue" = "Transparent"
|
|
"RenderPipeline" = "UniversalPipeline"
|
|
}
|
|
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
ZWrite Off
|
|
ZTest LEqual
|
|
Cull Off
|
|
|
|
Pass
|
|
{
|
|
Name "PortalVortex"
|
|
HLSLPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
struct Attributes
|
|
{
|
|
float4 positionOS : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _MainTex_ST;
|
|
float _RotationSpeed;
|
|
float _VortexStrength;
|
|
float _CenterGlow;
|
|
float4 _Color;
|
|
CBUFFER_END
|
|
|
|
TEXTURE2D(_MainTex);
|
|
SAMPLER(sampler_MainTex);
|
|
|
|
Varyings vert(Attributes input)
|
|
{
|
|
Varyings output;
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
UNITY_TRANSFER_INSTANCE_ID(input, output);
|
|
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
|
|
output.uv = TRANSFORM_TEX(input.uv, _MainTex);
|
|
return output;
|
|
}
|
|
|
|
half4 frag(Varyings input) : SV_Target
|
|
{
|
|
// UV 中心点
|
|
float2 center = float2(0.5, 0.5);
|
|
float2 uvOffset = input.uv - center;
|
|
|
|
// 极坐标:距离和角度
|
|
float dist = length(uvOffset);
|
|
float angle = atan2(uvOffset.y, uvOffset.x);
|
|
|
|
// 顺时针旋转:角度减去时间 * 速度
|
|
float rotation = _Time.y * _RotationSpeed;
|
|
|
|
// 扭曲强度随距离减小(中心扭曲更大)
|
|
float twist = _VortexStrength * (1.0 - dist * 2.0);
|
|
twist = max(twist, 0.0);
|
|
|
|
// 应用旋转 + 扭曲
|
|
float finalAngle = angle - rotation - twist * 3.14159;
|
|
|
|
// 转换回 UV 坐标
|
|
float2 vortexUV = center + float2(
|
|
cos(finalAngle) * dist,
|
|
sin(finalAngle) * dist
|
|
);
|
|
|
|
// 采样主贴图
|
|
half4 texColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, vortexUV);
|
|
|
|
// 中心发光:距离中心越近越亮
|
|
float glow = _CenterGlow * (1.0 - dist * 2.0);
|
|
glow = max(glow, 0.0);
|
|
|
|
// 边缘柔和过渡
|
|
float edgeFade = 1.0 - smoothstep(0.35, 0.5, dist);
|
|
|
|
// 最终颜色 = 贴图色 + 中心发光 * 蓝色调
|
|
float3 glowColor = float3(0.2, 0.6, 1.0) * glow;
|
|
float3 finalColor = texColor.rgb * _Color.rgb + glowColor;
|
|
|
|
float alpha = texColor.a * edgeFade;
|
|
|
|
return half4(finalColor, alpha);
|
|
}
|
|
ENDHLSL
|
|
}
|
|
}
|
|
FallBack Off
|
|
}
|