From 86e9aea176a999cb613b85f51d2de15ec490852c Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Wed, 14 Oct 2026 05:39:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=BF=AD=E4=BB=A326=20T4):=20=E5=85=89?= =?UTF-8?q?=E6=9F=B1=E8=BF=9E=E7=BB=AD=20alpha=20=E4=BF=AE=E8=BE=B9?= =?UTF-8?q?=EF=BC=88=E5=B8=A6=E5=86=85=E6=B8=90=E5=8F=98+=E7=BA=B5?= =?UTF-8?q?=E5=90=91=E8=A1=B0=E5=87=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - beams_rect 重写:带内 alpha 0→0.05→0 三角过渡(旧匀净零过渡硬边梯形退役)+纵向衰减上亮下暗; 连续 alpha 方案(grilling Q7 裁,与暗角/地图渐变保平滑同血统);filter=LINEAR 白名单随 T2 已落 - 冒烟 T4 结构断言 3 条(带心峰值≈0.05 按 8bit 截断量化校验/连续过渡像素 41373 个/纵向衰减 上半>下半 2 倍);冒烟 1037→1040/0;probe --click 全绿残留 0 - 引擎事实备忘:Godot Image 8bit 量化为截断(非四舍五入)——0.04977×255=12.69 存 12 --- game/presentation/views/ui_kit.gd | 16 +++++++++++++--- game/smoke/smoke_all.gd | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/game/presentation/views/ui_kit.gd b/game/presentation/views/ui_kit.gd index a4522e3f..2d5151ba 100644 --- a/game/presentation/views/ui_kit.gd +++ b/game/presentation/views/ui_kit.gd @@ -262,16 +262,26 @@ static func vignette_rect() -> TextureRect: # 斜光带(demo #v-start .beams——repeating-linear-gradient 102deg,暖白 5% 窄带 240-340/560px; -# 程序纹理循环带,确定性生成零随机) +# 程序纹理循环带,确定性生成零随机。迭代 26 T4 光柱硬边修(grilling Q7 裁=连续 alpha): +# 带内 alpha 0→0.05→0 横向过渡(旧匀净+零过渡硬边梯形退役)+纵向衰减上亮下暗; +# 纹理 filter=显式 LINEAR 白名单(与暗角/地图渐变同血统,见 T2) static func beams_rect() -> TextureRect: var img := Image.create(560, 560, false, Image.FORMAT_RGBA8) var ca := cos(0.2094) # 12°(102deg 带轴的垂直倾角) var sa := sin(0.2094) + var beam_col := Color(1.0, 236.0 / 255.0, 200.0 / 255.0) + var band_lo := 240.0 + var band_hi := 340.0 + var band_mid := (band_lo + band_hi) * 0.5 + var band_peak := 0.05 + var band_half := (band_hi - band_lo) * 0.5 for y in 560: + var v_fall := 1.0 - float(y) / 560.0 # 纵向衰减:上亮下暗(连续 alpha) for x in 560: var d := fposmod(x * ca + y * sa, 560.0) - if d >= 240.0 and d < 340.0: - img.set_pixel(x, y, Color(1.0, 236.0 / 255.0, 200.0 / 255.0, 0.05)) + if d >= band_lo and d < band_hi: + var a: float = band_peak * (1.0 - absf(d - band_mid) / band_half) * v_fall + img.set_pixel(x, y, Color(beam_col.r, beam_col.g, beam_col.b, a)) var tr := TextureRect.new() tr.texture = ImageTexture.create_from_image(img) tr.stretch_mode = TextureRect.STRETCH_TILE diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 7be9fae5..295cf436 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -5544,6 +5544,26 @@ func _smoke_texture_filter() -> void: vg.free() var bm = uikit_s.beams_rect() check(bm.texture_filter == CanvasItem.TEXTURE_FILTER_LINEAR, "V3 白名单在位:光柱 beams 显式 LINEAR") + # T4 光柱连续 alpha 结构断言(观感归目检):带心峰值 0.05/带缘连续过渡/纵向衰减上亮下暗 + var bimg: Image = bm.texture.get_image() + var max_a := 0.0 + var mid_a := 0 + var top_sum := 0.0 + var bot_sum := 0.0 + for y in 560: + for x in 560: + var pa := bimg.get_pixel(x, y).a + max_a = maxf(max_a, pa) + if pa > 0.001 and pa < 0.049: + mid_a += 1 + if y < 280: + top_sum += pa + else: + bot_sum += pa + check(max_a >= 12.0 / 255.0 and max_a <= 0.05, + "T4 光柱带心峰值 α≈0.05(8bit 截断量化下限 12/255,实测 %.5f)" % max_a) + check(mid_a > 100, "T4 光柱带内连续 alpha 过渡像素 %d 个(旧零过渡硬边已修)" % mid_a) + check(top_sum > bot_sum * 2.0, "T4 光柱纵向衰减生效(上半亮度 %.0f > 下半 %.0f 的 2 倍——上亮下暗)" % [top_sum, bot_sum]) bm.free() var gb = uikit_s.gradient_base(Color.BLACK, Color.WHITE) check(gb.texture_filter == CanvasItem.TEXTURE_FILTER_LINEAR, "V3 白名单在位:地图渐变 gradient_base 显式 LINEAR")