@@ -15,6 +15,8 @@ float collapse; //关闭/坍缩 0=正常 1=完全坍缩
1515float seed; //本实例随机种子
1616float2 portalSize; //传送门半轴像素 (宽,高),用于像素均匀采样
1717float facing; //+1 朝右 -1 朝左 控制内部数据流方向
18+ float quadInnerRadius; //portal 半径占 quad 半径的比例 [0,1]
19+ //quad 边在 p=±1,portal 边落在 p=±quadInnerRadius;越小则辉光余量越大
1820
1921struct 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
0 commit comments