夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MR Speaker Series: Shader Foundationsを読み解く §1 Shaderとは何か?

今回はShader学習枠です。

 MRGTのプロジェクトリーダーであり、筆者の尊敬しているエンジニアでもあるCameronさんによるShaderに関する講座がYoutube上で公開されていました。

全編が英語なのと、若干読み解きにくいところもあったため今回から読み解いていきます。

公開されている動画はこちらになります。

youtu.be

○セッションの目標 

この動画では初心者に開発の強力な基礎的なShaderの知識を提供すること

また熟練者にもおさらいという形で学ぶことができるようにする

という目的で公開されているようです。

筆者自身は初心者ではないとはいえ、まだまだ知識が足りない点も多いので読み解いていきます。

UnityのShaderLabを前提にしてMixedRealityアプリでのShaderに関しての注意事項などもないように盛り込まれています。

○スピーカー

Cameron Mickaさん

Microsoftのプリンシバルソフトウェアエンジニアで前述のとおりMixedRealityGraphicsToolsのリーダーでもあります。

github.com

2016年にMicrosoft社に入社する以前は10年間ゲームエンジニアとして活躍されていたそうです。

〇セッションの内容

セッションは次の8つのセクションで区切られています。

§1Shaderとは何か?

§ 2 Shaderの実行

§3 マテリアルとレンダーモード

§4 MixedReality における注意点

§5 パフォーマンスと最適化ツール

§6 デバッグ

§7 その他のリファレンス

§8 Q&A

§1Shaderとは何か?

Shaderとは何か?という説明は抽象的になりいきなり概念を理解することは難しいです。

まず、Shaderが解決しようとしている目的に関して紹介します。

○Shaderが解決しようとしている問題

Shaderはグラフィックに関するプログラムと指定使用されます。

一般的にコンピュータ上でグラフィックスの処理を行う際はグラフィックスパイプラインというパイプラインに従っています。

 各APIとドライバーはグラフィックスパイプラインに従ってアプリケーションからデータを受け取り出力する画像へ変換しています。

○input Assembly

グラフィックスパイプラインでは最初にInput Assembly(入力アセンブリ)の処理のステップから始まります。

 ここでは3Dモデルが持つ頂点をいくつかのプリミティブタイプ(基礎的な形状)に組み立てます。

 この際に各頂点にIDを割り当てたりなどを行っています。

○Vertex

 Input Assemblyで処理を終えたデータは次にVertexブロックでの処理が行われます。

Vertexはその名通り頂点シェーダーでこれは頂点を各アプリと、出力されるカメラ情報に基づいたクリップスペースへの頂点座標の変換を行っています。

ここまでは各頂点ごとに処理が行われています。

○Rasterization

Rasterizationステージではピクセル値を決定する処理を行います。

 

○Fraget

Fragmentステージはグラフィックスパイプラインのうち最も柔軟(プログラマブル)な部分です。

 プログラマブルとはコードを使用して編集がしやすいという意味で、Shaderの個性が出る部分でもあります。

ここでは描画されるピクセルごとに色を決めている処理になります。

 コンピュータではモニターの持つ画素数に応じてピクセルが決まっており、このピクセル数に応じて一つ一つ処理が実行され色が決まっています。

Wikipediaより引用

 ここでは例えば光の当たり方による陰の計算や、テクスチャ(画像)のサンプリング(貼り付け)などが行われています。

○Blending

Blendingは最終工程で、処理された色を、どのように既存の色(すでにある色)と混ぜ合わせるのか?

という意味です。

例えば、描画の処理は通常奥にある物体(背面)から行われますが、透明度を持ったオブジェクトは背面の色と透明度とを混ぜ合わせて出力されます。

このような処理をBlendingブロックで行っています。


これが一連のグラフィックス処理です。

2000年代まではこのグラフィックスパイプラインはプログラマブル(プログラミング可能)ではなく、固定関数的でした。

〇Shaderとは?

前述した通りグラフィックはグラフィックパイプラインで処理が行われていますが、このグラフィックパイプラインのプログラマブル(プログラミング可能)な個所のプログラミング処理がShaderになります。

具体的には頂点、フラグメントシェーダーなどプログラマブルなブロックでプログラミングを行うことができます。

実際のグラフィックスパイプラインは前述より複雑で、よりプログラマブルなブロックがあります。

これはGPUとGraphicsAPIによって決まっており、DirectX9以降では頂点シェーダーの次に処理されるジオメトリシェーダーなどが使えたり、APIのバージョンによって使用できる機能は若干異なってはいます。

〇§1まとめ

 Shaderとは何か?

 グラフィックスは通常グラフィックスパイプラインで行われている。

 シェーダーはそのグラフィックスパイプライン内のプログラマブルな処理を変更するプログラミング