Skip to content

Commit 4efb5fb

Browse files
committed
update
1 parent 0d074c9 commit 4efb5fb

3 files changed

Lines changed: 32 additions & 11 deletions

File tree

Assets/Effects/VictorCyberPortal.fx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ float collapse; //关闭/坍缩 0=正常 1=完全坍缩
1515
float seed; //本实例随机种子
1616
float2 portalSize; //传送门半轴像素 (宽,高),用于像素均匀采样
1717
float facing; //+1 朝右 -1 朝左 控制内部数据流方向
18+
float quadInnerRadius; //portal 半径占 quad 半径的比例 [0,1]
19+
//quad 边在 p=±1,portal 边落在 p=±quadInnerRadius;越小则辉光余量越大
1820

1921
struct PSInput
2022
{
@@ -58,23 +60,31 @@ float4 PixelShaderFunction(PSInput input) : COLOR0
5860
float2 p = (uv - 0.5) * 2.0;
5961
p.y = -p.y;
6062

63+
//quad 边缘软淡出(按矩形距离,与 portal 形状无关,保证 quad 任何边都不出硬切)
64+
//在 rectDist [0.76, 0.99] 内 23% 宽度内平滑淡出,>0.99 一律 0
65+
//quadInnerRadius=0.625 时 portal Y 端在 rectDist=0.625,离淡出起点还有 0.13 余量
66+
float rectDist = max(abs(input.TexCoords.x - 0.5), abs(input.TexCoords.y - 0.5)) * 2.0;
67+
float quadFalloff = 1.0 - smoothstep(0.76, 0.99, rectDist);
68+
if (quadFalloff <= 0.001) return float4(0, 0, 0, 0);
69+
6170
//collapse 期把整体往中心拉
6271
float collapseSq = collapse * collapse;
6372
p /= max(1.0 - collapseSq * 0.85, 0.05);
6473

6574
//当前开口因子:撕开瞬间小、张开时接近 1
6675
float openSq = saturate(openProgress);
67-
//椭圆边形状(竖立门,h > w 看起来更像撕开的口)
68-
//收口时纵向先收,再水平拍扁
76+
//椭圆边形状(竖立门,h > w);quadInnerRadius 把 portal 主体压在 quad 内侧
77+
//X 方向再 ×0.85 收窄,造型偏"撕开的口"
6978
float2 ellipNorm = p / float2(
70-
max(openSq * 0.85, 0.05),
71-
max(openSq, 0.05));
79+
max(quadInnerRadius * openSq * 0.85, 0.05),
80+
max(quadInnerRadius * openSq, 0.05));
7281
float ellipR = length(ellipNorm);
7382

7483
//——————————————————————————————
75-
//门外彻底丢弃(早期被裂痕外缘咬出毛刺,所以阈值大于 1
84+
//门外软衰减遮罩(替代硬截,配合 quadFalloff 让辉光不被画布切掉
7685
//——————————————————————————————
77-
if (ellipR > 1.42) return float4(0, 0, 0, 0);
86+
float farMask = 1.0 - smoothstep(1.20, 1.70, ellipR);
87+
if (farMask <= 0.001) return float4(0, 0, 0, 0);
7888

7989
//内部局部时间,统一节奏
8090
float tt = uTime * 1.05;
@@ -103,12 +113,12 @@ float4 PixelShaderFunction(PSInput input) : COLOR0
103113

104114
if (rimSdf > 0.0)
105115
{
106-
//门外只画边缘辉光
116+
//门外只画边缘辉光,由 farMask + quadFalloff 双重软淡出,避免被 quad 边切
107117
float outerGlow = exp(-rimSdf * 4.5);
108118
float flick = 0.6 + 0.4 * sin(tt * 18.0 + aN * 47.0 + seed * 13.0);
109119
float3 rim = float3(1.0, 0.42, 0.18) * outerGlow * flick;
110120
rim += float3(0.92, 0.08, 0.045) * pow(outerGlow, 1.7) * 0.6;
111-
float a = saturate(outerGlow * 0.85);
121+
float a = saturate(outerGlow * 0.85) * farMask * quadFalloff;
112122
return float4(rim * a, a) * input.Color;
113123
}
114124

@@ -297,6 +307,10 @@ float4 PixelShaderFunction(PSInput input) : COLOR0
297307
a *= lerp(1.0, collapseMask, collapse);
298308
col *= lerp(1.0, collapseMask, collapse);
299309

310+
//quad 边软淡出 + 椭圆外软衰减,杜绝画布边缘硬切
311+
a *= quadFalloff * farMask;
312+
col *= quadFalloff * farMask;
313+
300314
return float4(col * a, a) * input.Color;
301315
}
302316

528 Bytes
Binary file not shown.

Content/Cyberwares/Victors/VictorRiftPortalProj.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,21 @@ private float ComputeCollapseT(int age) {
301301
return MathHelper.Clamp((age - CollapseStart) / (float)(TotalLife - CollapseStart), 0f, 1f);
302302
}
303303

304+
/// <summary>
305+
/// 画布相对 portal 半径的放大倍数:quad 半径 = portal 半径 × QuadOverPortal
306+
/// <br/>必须 > 1.0;越大,辉光/锯齿/坍塌冲击波越不容易被 quad 边切;shader 同步收到 1/QuadOverPortal 作为内圈半径
307+
/// </summary>
308+
private const float QuadOverPortal = 1.6f;
309+
304310
private void DrawShaderPortal(Effect shader, float openProg, float emergePulse, float collapseT) {
305311
Texture2D canvas = CWRAsset.Placeholder_White.Value;
306312
Texture2D noise = CWRAsset.Extra_193.Value;
307313

308314
float halfW = BaseHalfWidth * Scale;
309315
float halfH = halfW * AspectRatio;
310-
//画布往外多 20% 给撕裂边缘留余量
311-
float quadW = halfW * 2.45f;
312-
float quadH = halfH * 2.45f;
316+
//quad 半轴 = portal 半轴 × QuadOverPortal,给所有外发光留出软淡出余量
317+
float quadW = halfW * QuadOverPortal * 2f;
318+
float quadH = halfH * QuadOverPortal * 2f;
313319

314320
shader.Parameters["uTime"]?.SetValue(Main.GlobalTimeWrappedHourly + visualSeed * 12f);
315321
shader.Parameters["openProgress"]?.SetValue(MathHelper.Clamp(openProg, 0f, 1.1f));
@@ -318,6 +324,7 @@ private void DrawShaderPortal(Effect shader, float openProg, float emergePulse,
318324
shader.Parameters["seed"]?.SetValue(visualSeed);
319325
shader.Parameters["portalSize"]?.SetValue(new Vector2(halfW, halfH));
320326
shader.Parameters["facing"]?.SetValue(Facing);
327+
shader.Parameters["quadInnerRadius"]?.SetValue(1f / QuadOverPortal);
321328

322329
SpriteBatch sb = Main.spriteBatch;
323330
sb.End();

0 commit comments

Comments
 (0)