Files
gold_dolphin/unity/Assets/Light/shaders/PortalVortex.shader
T
2026-07-05 22:11:50 +08:00

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
}