画面のレンダリング

画面の走査タイミング、レイヤーの合成、色計算について説明します。

走査のタイミング

PPUは画面を1ラインずつ、左から右、上から下の順に描画します。NTSCの場合、1フレームは262ライン(約60.1Hz)、1ラインは340ドットです。

区間内容
表示期間ライン1~224(オーバースキャン時は1~239)の描画が行われる期間
Hブランク各ラインの右端から次のラインの左端までの期間
Vブランク表示期間の最後のラインの後から次のフレームの先頭までの期間
強制ブランクINIDISPのビット7をセットして描画を止めている期間

VRAM・OAM・CGRAMは描画中にPPUが使用しているため、CPUから自由にアクセスできるのはVブランク中と強制ブランク中だけです。大量のデータを転送する場合は、Vブランク中にDMAを使用します(DMAおよびHDMA)。

現在の状態は HVBJOY で、走査位置は SLHV・OPHCT・OPVCT で確認できます。Vブランクの開始時にはNMIを発生させることができます(NMITIMEN)。

レンダリングパイプライン

SNES PPU レンダリングパイプライン

SNES PPUのレンダリングパイプラインの流れは次のようになります。

  1. VRAMおよびOAMのデータに基づき、各BGレイヤーおよびスプライトレイヤーを構成する。この時点ではCGRAMの色データは使用しません。
  2. すべてのレイヤーデータの信号はメインとサブの2系統に分配される。ここで、レイヤーデータから送られてくる信号は、各レイヤーのビット深度に応じた幅のピクセル値と、そのピクセルの優先度ビット(BGなら1ビット・スプライトなら2ビット)です。
  3. メイン系統の信号はTMレジスタで開閉されるメイン系統パススルーを通され、TMレジスタで選択されたBGの信号のみが後段の処理に送られる。サブ系統の信号についても同様にTSレジスタで開閉されるパススルーに通されます。
  4. ステップ3.を完了して送出されたメイン・サブのパススルー信号は、このタイミングでウィンドウマスクを適用されますが、これについては後述します。ウィンドウの設定により、特定のレイヤーの信号が遮断されます。
  5. ステップ4.を通過した信号は、メイン・サブともそれぞれ優先度解決回路に通され、各々最も優先順位の高い信号だけが出力されます。BGMODEレジスタのBG3優先フラグもこの回路の入力として扱われます。
    メイン系統では、選択された信号がどのレイヤーに由来する信号であるかを識別するための信号も同時に出力されます。また、入力がすべて透明色だった場合、この回路はメイン系統においてはCGRAMカラー0番、サブ系統においては固定色を出力します。
  6. サブ系統では、ステップ5.で出力された信号は、CGWSELレジスタのサブスクリーン・固定色選択ビットがクリアされている場合は固定色に強制的に置き換えられます。
  7. ステップ5.および6.で出力された信号は、メイン・サブともそれぞれカラーウィンドウの適用を受け、設定に応じてパススルーされたり置き換えられたりします。これについては後述します。
  8. メイン系統から出力されたレイヤー識別信号と、CGADSUBの下位6ビットの色計算有効フラグを色計算選択回路の入力として、現在のピクセルについて色計算の適用を行うかを決定します。
  9. メイン系統およびサブ系統の信号と、CGADSUBレジスタの色計算モード設定、およびステップ8.で出力された色計算選択信号を入力として、メイン系統の信号に対してサブ系統の色が加算または減算されて出力されます。
    色計算が適用されない場合はメイン系統の信号が出力されます。また、メイン・サブいずれか一方が透明の場合は、もう一方の色がそのまま出力されます。メイン・サブ両方が透明の場合は黒が出力されます。
    なお、スプライトレイヤーの色計算は、パレット4~7を使用するものだけが対象となることに注意してください。
  10. ステップ9.の出力は最後にINIDISPレジスタの輝度レベル設定に応じて信号強度をスケールされて映像信号として送出されます。

ウィンドウパイプライン

ウィンドウは独立した回路で処理され、それがレンダリングパイプラインのパススルー信号のマスクに使用されます。

  1. WH0/WH1で指定されるウィンドウ1、WH2/WH3で指定されるウィンドウ2のそれぞれについて、現在のピクセルのX座標がウィンドウの左端から右端の間に入っているかを検査し、1ビットで出力します。この出力はそれぞれ6つのチャネルに分配されます。
  2. それぞれのウィンドウの信号は、ウィンドウ選択回路に送られ、W12SEL・W34SEL・WOBJSELレジスタの設定に基づいて、各チャネルがパススルーされるか、遮断されるかします。
  3. ステップ2.のパススルー信号はさらにウィンドウ反転回路に送られ、W12SEL・W34SEL・WOBJSELレジスタの設定に基づいて、各チャネルがパススルーされるか、反転されて出力されます。
  4. ステップ3.のそれぞれのウィンドウのパススルー信号の各チャネルは、WBGLOG・WOBJLOGレジスタの設定で選択されるウィンドウ合成回路に通され、AND・OR・XOR・XNORのいずれかの処理を受けます。
    いずれか一方のウィンドウが無効の場合、この合成回路は有効なウィンドウの出力をそのまま出力します。また、ウィンドウが両方とも無効の場合、ピクセルは無条件でウィンドウ内にあるとみなされます。
  5. ステップ4.の出力のうち、BG1~4およびOBJに対応するチャネルは、メイン・サブの2系統にそれぞれ分配され、その各々がTMWレジスタおよびTSWレジスタで開閉される各系統のウィンドウパススルーに通されます。
  6. ステップ5.で遮断されなかったチャネルのウィンドウ信号は、レンダリングパイプラインのステップ4.でレイヤーデータの信号のパススルーおよび遮断に使用されます。
  7. ステップ5.で使用されなかった背景レイヤーのウィンドウ信号(カラーウィンドウ)は、メインとサブの2系統に分配され、それぞれCGWSELで指定されるゲートに通されます。レジスタの設定に応じてウィンドウは反転されたり、別の信号に置き換えられます。
    各レイヤーのウィンドウの適用よりも、サブスクリーン・固定色の切り替えのほうがレンダリングパイプラインの後ろにあるため、これらのレジスタは主にサブスクリーンが固定色である場合によく使用されます。
  8. ステップ7.で出力されたカラーウィンドウ信号は、レンダリングパイプラインのステップ7.で使用されます。

メインスクリーンとサブスクリーン

PPUはメインスクリーンとサブスクリーンの2つの画面を同時に合成します。それぞれに表示するレイヤーは TM・TS で選択します。
通常はメインスクリーンだけが表示され、サブスクリーンは色計算の相手として使用されます。高解像度モード(モード5, 6や疑似高解像度)では、メインスクリーンとサブスクリーンが1ピクセルずつ交互に表示されます。

レイヤーの重ね順

各スクリーンでは、BGの各階層とスプライトの各優先度が、BGモードごとに決まった順序で重ねられます(BGMODE)。
すべてのレイヤーが透明なピクセルには、背景色(CGRAMの色番号0)が表示されます。

色計算

色計算は、メインスクリーンの色にサブスクリーンの色(または固定色)を加算・減算する機能です。半透明の表現や、画面全体を明るく・暗くする効果に使用されます。

設定レジスタ
加算・減算、半分にするか、適用するレイヤーCGADSUB
相手(サブスクリーン・固定色)、適用する範囲CGWSEL
固定色COLDATA

計算は色成分(赤・緑・青)ごとに行われ、結果は0~31の範囲に制限されます。スプライトはパレット4~7のものだけが対象になります。
適用する範囲は色ウィンドウで指定できます(ウィンドウマスク)。

画面の明るさ

最終的な出力の明るさは INIDISP で16段階に設定できます。フェードイン・フェードアウトに使用されます。

参照

BG
スプライト
ウィンドウマスク
色フォーマット