feat(迭代26 T4): 光柱连续 alpha 修边(带内渐变+纵向衰减)

- 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
This commit is contained in:
DKChan committed 2026-10-14 05:39:56 +08:00
1 parent 7cac0dc1ab
commit 86e9aea176
2 files changed
+33 -3

No files matched your search

+13 -3
View File
@@ -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
+20
View File
@@ -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")