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")