【Unity-Shader】#00 レンダリングパイプライン

この記事は…

booth.pm

主に上記の電子書籍で学んだことを自分用にまとめたものです。
Shaderを学ぶのに始めに読むのにかなりお勧めの本でした!

UnlitShader

Un Lighting Shader の略。
陰影や輝きを表現する「ライティング」「シャーディング」といった処理を含まないシェーダのこと。
オブジェクトの設定された色やテクスチャがそのまま描画されるもっともシンプルなシェーダのこと。

つまり、学習しやすい。

3Dオブジェクトを描画するには

「レンダリングパイプライン」と呼ばれる工程を行うことで、3Dオブジェクトが画面に出力される。

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

1:頂点の映る位置を算出する ⇒Vertex Shader
2:ポリゴンの表裏を確認する ⇒Culling
3:描画する画素を決定する ⇒Rasterize
4:ZBufferの値を比較する ⇒Z Test
5:画素を描画する ⇒Fragmet Shader(Pixel Shader)
6:描画する色を合成する ⇒Blending
7:ZBufferの値を更新する ⇒Z Write

1と5、つまりVertex ShaderとFragment Shader の処理部分はプログラムを実装して自由に変更することができる。

プログラマブルシェーダー

実装するプログラムによってオブジェクトの描画方法を任意に実装する仕組みのこと。
フラグメントシェーダや、頂点シェーダはまさにこれ。

1:頂点の映る位置を算出する Vertex Shader

・オブジェクト←複数のメッシュ
・メッシュ←複数のポリゴン
・ポリゴン←3つの頂点

画面上のどの位置に頂点を描画するのか算出する。ポリゴン1つを表示するには3つ頂点があるので3回行う。

2:ポリゴンの表裏を確認する

ポリゴンには表裏が設定されている。
 →unityではその頂点の番号が時計まわりに見える方向を表として定義している

描画負荷を下げるために裏面をむいているポリゴンは描画しないようにしている=culling (カリング)
shaderにおけるcullingを Backface Culling という

というのがデフォルトの動作で設定によって、裏面のみ描画、表・裏どっちも描画、という風にもできる

3:描画する画素を決定する

ポリゴンが画面上のどの画素に描画されるかを決定する=ラスタライズ Rasterize
1で頂点位置が決まり、3でポリゴンがどの画素で描画するかが決まる

4:ZBufferの値を比較する

描画する画素に既に描画されているポリゴンがないか確認する。描画済みのポリゴンが存在するかどうかは「Z Buffer」に書き込まれている
「Z Buffer」は描画する画面と同じ解像度を持った異なる画面
「Z Buffer」=「Depth Buffer」・深度バッファ
「Z Buffer」にはカメラからポリゴンまでの距離を表す値=z座標が書き込まれている

描画しようとしているポリゴンのZ値がすでに描画されているポリゴンのZ値よりも小さい場合は、
描画しようとしているポリゴンの方が手前になる

Z値を比較する処理を「Z Test」、またはDepth Testという
「Z Testに成功する」とは、Z値を比較して、新しいポリゴンが描画できる状態のことをいう

5:画素を描画する Fragmet Shader(Pixel Shader)

画素に描画する色を算出して描画する
色は光源や、他のオブジェクトの影を考慮したり、あるいは、テクスチャを参照するなどして算出する

この処理はラスタライズで決定された画素の数分行われる。

6:描画する色を合成する Blending

半透明なオブジェクトを描画する場合、重なった奥にあるオブジェクトを描画してから、そのあとに半透明なオブジェクトの描画を行う。
半透明なので、先に描画したオブジェクトの色と合成して描画する。

★不透明なオブジェクト→半透明なオブジェクト という順番で描画する

7:ZBufferの値を更新する

画素の描画が終わったら、Z Bufferに新しいZ値を書き込んで更新する。=「Z Write」