|
10 |
GameFSMの改良 (22) |
オリジナルのゲームのうち、アップライト型は前方の背景と下方のブラウン管映像がハーフミラーで合成されています。今回はその効果を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とします。

ただし、背景は前景の邪魔にならないように暗めにαブレンディングするため、結果の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 コード
- 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}= 0000add_b = 4'hC & 4'b0000 = 0out = min(bg + 0, 15) = bg→ 背景だけ(透過光だけ)
fg1 = 1のとき{fg1,fg1,fg1,fg1}= 1111add_b = 4'hC & 4'b1111 = 4'hCout = min(bg + 12, 15)→ 背景に「反射光分 12段」を足して、4bit 上限 15 を超えたら飽和
という「足し算+クリップ」によりハーフミラー効果を再現しています。