Posts Issued on December 10, 2025

GameFSMの改良 (22)

posted by sakurai on December 10, 2025 #1047

オリジナルのゲームのうち、アップライト型は前方の背景と下方のブラウン管映像がハーフミラーで合成されています。今回はその効果をFPGAで表現したいと思います。

まず背景画像はここで取得します。画像が大きいので、400x295x12bitにダウンサイズします。$(g_3, g_2, g_1, g_0, r_3, r_2, r_1, r_0, b_3, b_2, b_1, b_0)$という各色4bitカラーの12bitとします。

図%%.1
図1047.1 背景画像

ただし、背景は前景の邪魔にならないように暗めにαブレンディングするため、結果のMSBは常に0となります。従ってαブレンディング後のデータをROMに格納し、MSBを0として使用することにすれば、各色3bitの画像ですみます。

背景画像の前処理

  • γ補正
  • 全体的な減光 を掛けたうえで 3bit に量子化する。 $$ q_3 = \left\lfloor d \cdot \left(\frac{x}{255}\right)^{\frac{1}{\gamma}} \cdot 7 \right\rfloor $$ ここで
  • $x$:0..255 の元ピクセル値
  • $\gamma$:例えば$1.6$
  • $d$:暗さを決める係数、例えば$0.4$
  • $q_3$:0..7 の 3bit コード
  1. ROM には GRB333 で格納する。 $$ \text{word} = 64 \cdot G_3 + 8 \cdot R_3 + B_3 $$

デコーダ側は、 $$ \text{out} = \min\bigl(\text{bg} + \text{fg} \cdot A,\ 15\bigr) $$

  • $\text{bg}$:背景の 4bit 値(0..15) → 実際には MSB=0 なので 0..7 の範囲
  • $\text{fg}$:前景ビット(0 または 1)
  • $A$:前景の「足し込む強さ」(いまは (A = 12 = 4'hC))

  • fg1 = 0 のとき

    • {fg1,fg1,fg1,fg1} = 0000
    • add_b = 4'hC & 4'b0000 = 0
    • out = min(bg + 0, 15) = bg  → 背景だけ(透過光だけ)
  • fg1 = 1 のとき

    • {fg1,fg1,fg1,fg1} = 1111
    • add_b = 4'hC & 4'b1111 = 4'hC
    • out = min(bg + 12, 15) → 背景に「反射光分 12段」を足して、4bit 上限 15 を超えたら飽和

という「足し算+クリップ」によりハーフミラー効果を再現しています。


左矢前のブログ 次のブログ右矢