本日はシェーダー学習枠です。
現在MRTKやMRGTでグラフィックを担当されているMicrosoftのCameronさんによるMR向けのShader解説セッションを読み解いています。
前回までは§2のシェーダーの実行をコードを読み解きながら見ていました。
今回からは§3です。
〇セクションの内容
セッションは次の8つのセクションで区切られています。
§1Shaderとは何か?
§ 2 Shaderの実行
§3 マテリアルとレンダーモード
§4 MixedReality における注意点
§5 パフォーマンスと最適化ツール
§6 デバッグ
§7 その他のリファレンス
§8 Q&A
〇マテリアルとレンダーモード
〇マテリアルとは?
よく混同される言葉としてシェーダーとマテリアルがあります。
マテリアルはシェーダーをカプセル化しています。
1つのシェーダーで複数のマテリアルを設定できます。
これはUnityを触っている人であればマテリアル作成時によく使うと思います。
またマテリアルはシェーダーの入力とレンダリング状態を指定しています。
この時にシェーダーは複数の異なるマテリアルに対して別々の入力値(パラメータ)を使用して描画を行うことができます。
同時にグラフィックAPIに対して情報を渡しますが、レンダリング状態も同様に渡されています。
〇レンダリング状態とは
レンダリング状態は、その名の通りレンダリング時の状態を制御するもので、グラフィックスAPIに対して指示を出しています。
例えばあるマテリアルをすでにレンダリング済みのほかのマテリアルとブレンド(合成)する方法や、ポリゴンの面ごとの描画に関しての指示、マテリアルを深度バッファに書き込むかどうかなど様々な情報をグラフィックスAPIに伝えています。
前述のとおり、レンダリング状態は複数の組み合わせによって決定されているため、数千パターンを越える組み合わせが可能ですが、次の図はMRにおいて頻出するレンダリング状態の例です。
Opaqueは不透明なマテリアルで、一番一般的なレンダリング状態です。
透過を行わないため、一般的に奥にある物体から上書きされるようにピクセルが塗られています。
Cutoutはテクスチャなどで一部が透明になっています。
これはピクセルごとに透過性を持っているか不透明かわかれています。
余談ですが、CutoutのマテリアルはUnityでポストプロセスがかからないようです。
Fadeは非物理学的な透明です。
オブジェクトに全体的に透明度を持っており、その透明度の在り方は物理的な計算を行っていません。
TransparentはFade同様半透明ですが、物理的な処理を考慮した半透明です。
水やガラスなどのような物理的な光を計算に考慮しています。
Additiveは一般的にエフェクトなどで使用される透明度で明るく見えます。
本日は以上です。
レンダリング状態に関してみていきました。