Tech Sketch Bucket of Technical Chips by TIS Inc.

3Dプログラミング基礎知識(5)

Pocket

3Dプログラミング基礎知識(4)の続きです。

画面に描画されるまでの流れ(おさらい)

Pipeline.png

パイプラインには書かれていませんが「ビューポート変換」と「Zバッファ」についてみていきたいと思います。

ビューポート変換

射影変換を行った後の座標系は、視錐台の領域をX軸(-1.0 ~ +1.0)、Y軸(-1.0 ~ +1.0)、Z軸(0.0 ~ +1.0)に変換したものになります。これを実際に描画する座標へ変換するのがビューポート変換です。
実際の描画サイズはPC、スマートフォンなどのデバイスによって異なりますが、今回は640 × 480の画面に描画する場合を考えます。

射影変換済み頂点において、 X = -1.0 は視錐台の左面、すなわち視野の左端に相当します。その為、この頂点を画面に描画する際には X = 0 px の場所に描画されます。
同様に X = +1.0 が画面右端のため X = 639 px に、 Y = +1.0 が画面上端のため Y = 0 px に描画されます。

ViewPort.png

Zバッファ

ビューポート変換では2D平面上での変換を行うため、射影変換の結果の内、X, Yのみを使用しました。
残ったZ値は2D平面に投影したポリゴンが重なった際に前後関係を判断し、どのように描画するかを判断するのに使われます。

ZBuffer.png

Zバッファは画面と同じサイズ(今回の場合であれば640 × 480)のメモリ領域で、各ピクセルは初期化時に指定したビット数の値を格納することができます。

ZBuffer2.png

ZテストとZ値の書き込み

各ピクセルの描画を行う前には、「描画しようとしているピクセルのZ値」と「ZバッファのZ値」を用いて比較(Zテスト)が行われ、テストにパスした場合のみ描画が行われます。
Zテストの内容は幾つかの条件から選ぶことができますが、前後関係を判断する為のZテストとしては「書きこもうとしているピクセルのZ値」 <= 「ZバッファのZ値」が使われます。

この場合、描画しようとしているピクセル(例えばz=0.8)よりも手前にピクセル(例えばz=0.5)があった場合は、テストに失敗するために描画が行われず、前後関係を正しく表現することができます。

Zテストに成功して書き込みが行われる場合、同時にZバッファへピクセルのZ値が書き込まれ、次の描画からはこの値がZバッファのZ値として使用されます。

Zバッファと半透明

不透明ポリゴンに関してはZバッファさえあればどんな順番で描画しても問題なく描画されます。
Zテストによって描画処理を省けるため、一番手前にあるポリゴンから順に描画していく方が高速ですが、逆順に描画したとしても見た目は変わりません。

しかし、半透明ポリゴンの場合には描画する順番によって見た目が変化してしまいます。

例として赤い半透明ポリゴン(A)の後ろに緑の不透明ポリゴン(B)があった場合を考えます。また、背景色は青とします。

ZBuffer3.png

  • 手前から(A→Bの順で)描画した場合(NG)
    • 先に半透明ポリゴンAが描画される為、背景色の「青」と半透明ポリゴンAの「赤」で色の合成が行われます。この際、Zバッファの値も更新されます。
    • 手前にある半透明ポリゴンAの描画でZバッファが更新されている為、不透明ポリゴンBのうち重なった部分の描画は行われません。

結果として、半透明ポリゴンであるはずのAがBを隠してしまうというおかしな状態になっています。

  • 奥から(B→Aの順で)描画した場合(OK)
    • 先に不透明ポリゴンBが描画されます。この際、Zバッファの値も更新されます。
    • 半透明ポリゴンAの方がZ値が小さいため、Zテストをパスします。不透明ポリゴンBの「緑」と半透明ポリゴンAの「赤」で色の合成が行われます。

半透明なポリゴンが含まれる場合、後ろから順に描画していく必要があることが分かります。

あとがき

ようやく3Dの頂点情報から、2D平面上の頂点までの変換が終わりました。
描画されるピクセルの色はともかく、ここまでの変換が行えればオブジェクトの形を2D平面上に映すことができます。

次回はピクセルの色を決定する「ライティング」、「テクスチャ」です。

参考情報 / 使用ツール

エンジニア採用中!私たちと一緒に働いてみませんか?