Files
gplan-2/game/presentation/views/seal_mark.gdshader
T

51 lines
2.3 KiB
Plaintext

// VERTICAL SLICE - NOT FOR PRODUCTION
// 封印印记(卡④ 法阵化批)——环+十字+环外压暗光圈,canvas_item 距离场实时绘制(无贴图缩放,
// 格边 26–46px 连续可变下任意格边清晰)。
// 事实源:art-bible v3.41 §3.2「封印印记」(形/画法/光圈/层序纪律)+ §8.2「封印印记参数表」;
// gdd/ux/battle.md「棋盘格尺寸公式」(格边 clampi 26–46)。
// 纪律:参数五枚+色全由 gd 侧逐次注入(参数单点 = ui_kit SEAL_* 五常量——禁在此改值,
// 下方默认值仅为兜底且与 §8.2 同值);光圈不出格(半径夹 cell_px/2);
// 零动效(不呼吸不脉冲——§2.1 挖掘期唯一在动 = 接触带微光);印记与光圈同用一色(光圈只改 alpha)。
// 坐标口径:VERTEX 为格件本件局部像素坐标(0..cell_px),不依赖 UV(同 cell_type_glow 口径)。
shader_type canvas_item;
render_mode blend_mix;
uniform float cell_px : hint_range(8.0, 128.0) = 46.0;
uniform float ring_frac = 0.82;
uniform float wall_frac = 0.11;
uniform float arm_frac = 0.156;
uniform float halo_frac = 0.09;
uniform float halo_alpha : hint_range(0.0, 1.0) = 0.50;
uniform float halo_gamma = 1.6;
uniform vec4 mark_col : source_color = vec4(0.0, 0.0, 0.0, 1.0);
varying vec2 v_local;
void vertex() {
v_local = VERTEX;
}
void fragment() {
vec2 d2 = v_local - vec2(cell_px * 0.5);
float r = length(d2);
float ring_r = 0.5 * cell_px * ring_frac;
float wall = wall_frac * 2.0 * ring_r;
float arm = arm_frac * 2.0 * ring_r;
float halo_w = 0.5 * cell_px * halo_frac;
// 印记体:环带(ring_r-wall/2 ≤ r ≤ ring_r)或十字(轴向带内且 r < ring_r——四端顶到环内沿)
bool in_ring = (r <= ring_r) && (r >= ring_r - wall * 0.5);
bool in_arm = (r < ring_r) && ((abs(d2.x) < arm * 0.5) || (abs(d2.y) < arm * 0.5));
float a = 0.0;
if (in_ring || in_arm) {
a = 1.0;
} else if (r > ring_r) {
// 环外压暗光圈:自环外缘向外衰减(半径夹 cell_px/2——不出格、不外溢邻格)
float rc = min(r, cell_px * 0.5);
float t = clamp((rc - ring_r) / max(halo_w, 0.001), 0.0, 1.0);
a = halo_alpha * pow(1.0 - t, halo_gamma);
}
COLOR = vec4(mark_col.rgb, mark_col.a * a);
}