開始方法
最も簡単な方法は、既存のシェーダーでニーズに最も近いものを選択し、要素を追加または削除することです。一からシェーダーを作成するのは難しい場合があります。
既存のシェーダーをロードするには、ファイルブラウザから開くだけです。または、コンパウンドに既に接続されているシェーダーを、Alt + ダブルクリックで直接開くこともできます。
既存のシェーダーを直接編集しないでください。必ず新しい名前で保存し、Commonライブラリには保存しないでください。プロジェクトのフォルダー内の任意のフォルダーを使用してください。詳細については、こちらを参照してください。
シェーダーのアーキテクチャ
例として、Norm_Spec.xshadというマテリアルシェーダーを開きます。このシェーダーはノーマルマップとスペキュラーマップをサポートしています。シェーダーのカテゴリと命名規則については、Shader Categories and Naming Conventionを参照してください。
マテリアルシェーダーは常に2つの主要なセクションから構成されます:Vertexシェーダー(レンダリングされたメッシュの各頂点での計算用)とPixelシェーダー(レンダリングされたポリゴンの各ピクセルでの計算用)。
メッシュの自動テッセレーションを必要とするシェーダー(例:Displaceシェーダー)は、テッセレーション制御用のHullシェーダーとテッセレーションされたメッシュの頂点計算用のDomainシェーダーという追加のブロックを使用します。ただし、このドキュメントではこれらの詳細には触れません。
シェーダーグラフで使用されるプロパティとワイヤーのデータ型は、コンパウンドのものと非常に似ています。ただし重要な違いがあります。データ型については、Pin Data Types (Compound and Shader) の「Shaders」セクションを参照してください。
頂点シェーダー
ほとんどのケースではこのモジュールは変更する必要はありません。技術的な詳細に興味がない場合は、ピクセルシェーダーに進んでください。
Vertex モジュールをダブルクリックして開きます。
頂点シェーダーはメッシュのそれぞれの頂点で実行されます。主な役割は、レンダリングシステムから渡される行列を使用して、頂点の位置と法線をワールド空間とカメラ空間に変換することです。その他の変換も行うことができます。
入力
頂点に格納されているすべてのデータは、Material Vertex Input モジュールから取得できます。
ご覧の通り、World Transformation マトリックスもここから取得されています。これはグローバルシステム値ではなく、頂点ごとの値です。その理由は、スキンメッシュを使用する場合、実際のワールド変換は複数のボーンからブレンドされるため、各頂点に異なるワールド変換が適用されるためです。
処理
その後、頂点の位置、法線ベクトル、接線ベクトルをワールド変換で変換する必要があります。頂点の位置は、カメラ投影空間という別の空間にも変換する必要があります。詳細に興味がある場合は、Position & Normal ボックスを参照してください。
Tangent と Binormal は、Normal と共に、指定された頂点におけるTangent Space の基底ベクトルを構成します。ここでは詳細には触れませんが、これらのベクトルはNormal Mapを使用する際必要になります。
結果は、Proj Position(2D画面上の頂点の最終位置)、World Position(ワールド空間内の頂点の位置)、およびWorld Normal, Tangent, Binormal(ワールド空間座標系で表されたタンジェント空間のベクトル)です。後者の4つはさまざまな用途に利用できますが、主な用途はライティング計算です。
Prev xxxxという名前の追加プロパティがあります。これらは、以前にレンダリングされたフレームに対応するデータを表します。Velocity Mapを生成する際に使用されます。Not Jittered xxxxの位置は、TXAAや類似のアンチエイリアシング手法を使用する際に使用されます。詳細は省略します。
テクスチャ座標 (UV) もここで変換可能です。
ご覧の通り、変換自体はTex Coord Transfという公開ピンから来ています。このような公開ピンは、シェーダーがコンパウンドにインポートされた際にシェーダーモジュールに表示されます。これにより、ユーザーはこれらの入力値を完全に制御でき、この場合UVに対して任意の変換を指定できます。
注意:頂点には2つのテクスチャ座標セットを持つことができます。2つ目は通常、ライトマップなどのグローバルテクスチャに使用されます。この特定のシェーダーはライトや類似のマップをサポートしていないため、Tex Coords 2を出力にフォワードする必要はありません。
出力
上記の出力は、Material Vertex Output モジュールに接続する必要があります。
これらの出力は次のように使用されます。システムはメッシュを三角形ごとにレンダリングします。各三角形に対して、頂点シェーダーは3つの頂点すべてに対して実行されます。頂点の計算された投影位置に基づいて、システムは画面上に三角形をピクセル単位でレンダリングを開始します。各ピクセルに対して、頂点シェーダーの3つの頂点出力から補間された入力値を引数としてピクセルシェーダーが実行されます。
ピクセルシェーダー
Pixel モジュールをダブルクリックして開きます。
ピクセルシェーダーは、上記のように頂点シェーダーからインターポレートされたデータを使用して、メッシュ表面のレンダリングされた各ピクセルに対して実行されます。
入力
インターポレートされたデータは、マテリアル ピクセル入力モジュールから取得できます。
ご覧の通り、一部のデータは頂点シェーダーとはやや異なる形式で表示されています。例えば、接線空間ベクトルは個別に提供されず、既にTangent To Worldマトリックスに統合されており、このマトリックスを直接使用してノーマルマップベクトルを変換できます。
テクスチャサンプリング
次に重要なモジュール群はテクスチャサンプリングです。これらはテクスチャプロパティを露出しています。シェーダーをコンパウンドにインポートすると、これらのピンがビデオ入力ピンとして表示され、テクスチャを接続できるようになります。Sample モジュールは、Texture Coordinates(UV)で指定された位置からテクスチャの色を抽出します。これらは通常、ピクセルシェーダーの補間されたTex Coords入力から直接接続されます。
3つ目の入力はSampler Stateで、サンプリングモード(フィルタリング、アドレス指定モードなど)を指定します。
サンプラーはRGBColorとアルファチャンネル(Opacity)を別々に出力します。注意:Aximmetryノードシステムはグラフ全体でプリマルチプライドRGBを想定しているため、カラーマップもこの形式で到着します。したがって、シェーダーで透明色を適切に処理するには、Unpremultiplyをオンにすることを推奨します。
これはNormal Mapには当てはまりません。プリマルチプライド解除してはならず、RGB部分のみが必要です。
色は、ユーザーに露出される要因または頂点シェーダーから来る要因によってモジュレートできます。
しかし、Normal Mapの値は全く異なる方法で処理する必要があります。これらは色ではなく3D法線ベクトルを表します。まず、テクスチャから来る色値を法線ベクトルに変換し、次にこのベクトルをワールド空間に変換して正しい光計算を可能にします。これらの機能はTex To Normalモジュールで実現されます。
その変換は、ピクセルシェーダーのTangent To World入力から来ています。これは上記で既に説明しました。
BC5(別名3Dc)形式のテクスチャをノーマルマップとして使用する場合、Calc Norm Z'を有効にする必要があります。そうでない場合はOFFに設定してください。
照明計算
現在、照明計算に必要なすべてのデータが揃っています。
これらのデータは2つのフェーズに分割されています。Material Precalc モジュールは、一部の事前計算を行います。この理由は、これらの計算データが照明計算だけでなく、他の特殊な操作にも役立つためです。例えば、反射を実装する場合、Reflection Direction と Fresnel Value が必要です。照明には Fresnel Value のみが必要です。
2つ目の、はるかに大規模なフェーズはLightingモジュールによって実行されます。このモジュールは、シーン内のすべての光源が作業中のピクセルに与える影響を計算します。ピクセルの世界座標、法線など考慮し、ユーザーが指定可能なパラメーター(Ambient、Diffuseなど)の材質の色も適用します。
ピクセルの計算されたスペキュラーハイライトは、Additive出力に別々に表示されます。これは、透明なマテリアルで特別に処理する必要があるためです。ハイライトは、Opacity値によって減衰されてはならず、ほぼ完全に透明な表面(ガラスなど)でも輝かなければなりません。(反射を適用する場合、ハイライトはAdditive出力に追加する必要があります。シェーダーNorm_Refl.xshadを参照してください。)
出力
最終的なレンダリングステップ(色、不透明度、加算色、ハイライト、法線など)をターゲット画像に書き込む処理は、Material Pixel Output モジュールによって実行されます。このモジュールは複数のターゲットを同時に書き込むことができます:最終カラー画像、法線マップ、速度マップ、マスク。これらの結果は、シーンのレンダリングに使用するCamera モジュールから渡されるものです。
例:変更例
カラーマップにオーバーレイされる追加のテクスチャを追加したいとします。これをオーバーレイマップと呼びます。これはメッシュのセカンダリ UV セットで任意のテクスチャ座標変換を使用してサンプリングする必要があります。
まず、シェーダーをプロジェクトフォルダー内の任意の場所に「Norm_Spec_Overlay.xshad」という名前で保存します。
頂点シェーダー
頂点シェーダーを修正し、頂点のTex Coord 2を使用するようにします。まず、直接出力に接続します:
トランスフォームモジュールを挿入し、その変換を露出させてUV変換関数を提供します。
ピクセルシェーダー
オーバーレイテクスチャ用の新しいSamplerが必要です。名前をSample Overlayとします。そのTexture入力は公開する必要があります。
そのTex Coordsは、以前に提供した対応する頂点シェーダーの値から補間された値であるTex Coords 2入力から接続する必要があります。Sampler Stateは他のテクスチャと同じで構いません。
次に、その出力をカラーマップの出力とブレンドします。Blend モジュールをOverlay モードで使用します。
以上です。これは基本的な例ですが、主要な手順を明確に示しています。
もちろん、Math モジュールを使用して、任意の入力に対して色、ベクトル、スカラーの変換を自由に施すことができます。