Skip to content

fix: #98 eye_strain GLSL にブラー段を追加し等価テストの偽装を解消#119

Merged
kako-jun merged 2 commits into
mainfrom
98-eye-strain-glsl-blur
May 26, 2026
Merged

fix: #98 eye_strain GLSL にブラー段を追加し等価テストの偽装を解消#119
kako-jun merged 2 commits into
mainfrom
98-eye-strain-glsl-blur

Conversation

@kako-jun
Copy link
Copy Markdown
Owner

関連 Issue

closes #98

問題

  • CPU vision::eye_strain は contrast→vignette の後に strength*1.5px disk blur を適用するが、eye_strain.frag は contrast+vignette のみでブラー段が無かった。
  • 等価テスト simulate_eye_strain_glsl が実 .frag を読まずブラー無しの別アルゴリズムをインライン再実装していたため、.frag のブラー欠落がテストから見えなかった(偽装)。

変更内容

  • eye_strain.frag に CPU と同順序・同半径のブラー段を Fibonacci lattice 16 tap で実装(shader: photophobia GLSL にブラーループが無く CPU の disk-blur bloom を再現できない #97 photophobia と同方式)。EyeStrainUniforms/eye_strain_uniforms(strength,width,height) 新設(純追加、外部呼び出し元なし)
  • simulate_eye_strain_glsl を実 .frag 忠実ミラーに書き換え(偽装解消)。これで CPU・.frag・sim の3者が一致し、ブラー欠落が起きれば PSNR が崩れて検出される
  • 等価テスト追加: strength 0.0/0.3(radius<0.5境界)/0.5/1.0、128px、非正方形、contrast圧縮+vignette効果アサート

検証

  • cargo test --test shader_equivalence: 74 passed / 0 failed(eye_strain 8件)
  • PSNR: strength=0.5 で 40.0dB、1.0 で 42.3dB、128px で 52.1dB(唯一の乖離源は pillbox vs 16tap、下限30dB 超)
  • cargo clippy 警告ゼロ

kako-jun added 2 commits May 26, 2026 18:19
eye_strain.frag が CPU vision::eye_strain の disk blur 段(半径
strength*1.5px)を欠いており、universal-experience の表示と CPU が乖離して
いた。等価テスト simulate_eye_strain_glsl は実 .frag を読まずブラー段の無い
別アルゴリズムをインライン再実装しており、その欠落を隠蔽していた。

- eye_strain.frag に CPU と同一順序(contrast → vignette → disk blur)の
  ブラー段を追加。厳密 pillbox を Fibonacci lattice 16 tap で近似(#97 の
  photophobia.frag と同方式)。各 tap で contrast+vignette を再計算してから
  円盤状に平均、linear sRGB 空間で処理
- simulate_eye_strain_glsl を新 .frag と式を 1:1 対応する形に書き換え、CPU・
  .frag・sim の3者一致を保証(偽装解消)
- shader_equiv_eye_strain_strength_0_5_psnr を追加。既存 strength=1.0 も新
  sim で検証。PSNR は 32x32 で s=0.5→40.0dB / s=1.0→42.3dB(下限 30dB 超)
- API 追加: eye_strain_uniforms(strength, width, height) と EyeStrainUniforms
  (uRadiusPx / uTexelSize)。eye_strain_glsl() の外部呼び出し元なし、既存
  シグネチャ変更なしの純粋な追加
CPU↔GLSL 等価テストに以下6観点を追加(実装担当の strength=0.5 と重複なし):
- strength=0.0 identity(CPU は byte-exact、GLSL は効果オフを高 PSNR で確認)
- radius<0.5 境界(radius=0.45px で blur 段が無効化され center 経路を通ることを byte-exact 参照と一致で証明)
- 大画像 128x128 の等価(16tap lattice 近似が破綻しないこと)
- 非正方形 64x32 / 32x64 の等価(texel アスペクト下の blur 等方性)
- 効果アサート(identity 偽陽性排除): 明暗エッジで contrast 圧縮、一様グレーで vignette 減光が実際に起きること

simulate_eye_strain_glsl は eye_strain.frag と式が 1:1 対応していることを確認済み。
@kako-jun kako-jun merged commit b3ae398 into main May 26, 2026
1 of 3 checks passed
@kako-jun kako-jun deleted the 98-eye-strain-glsl-blur branch May 26, 2026 09:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

shader: eye_strain GLSL が CPU のブラー段を省略・等価テストがインライン再実装で乖離を隠蔽

1 participant