Unityでは、通常、シェーダープログラムは HLSL で記述します。HLSL コードを シェーダーアセット に追加するには、シェーダコードブロック の中にコードを入れます。
注意Unity では他の言語によるシェーダープログラムの記述もサポートしていますが、一般的には必要なく、推奨されていません。詳細については、シェーダーの作成 を参照してください。
このセクションでは、HLSL を Unity 固有の方法で使用するための情報を提供します。HLSL の記述に関する一般的な情報については、Microsoft の HLSL に関するドキュメント を参照してください。
注意Unity はもともと Cg 言語を使用していたため、キーワード (CGPROGRAM) とファイル拡張子 (.cginc) の一部の名前になっています。現在、Unity では Cg を使用していませんが、これらの名前はまだ使用されています。
HLSL には 2 つの構文があります。古い機能の DirectX 9 スタイルの構文と、より新しい DirectX 10 以降のスタイルの構文です。その違いは、主にテクスチャサンプリング関数の機能です。
Unity では、これらの違いを管理するのに役立つプリプロセッサーマクロを含むシェーダーライブラリを提供しています。詳細は、ビルトインシェーダーマクロ を参照してください。
頂点シェーダー は、 3D モデルの各頂点で実行されるプログラムです 。ほとんどの場合、頂点シェーダーは特に重要な処理は行いません。ここでは、頂点位置をオブジェクト空間からいわゆる “クリップスペース” に変換します。これを使用して、GPU が画面上のオブジェクトをラスタライズします。また、フラグメントシェーダーでテクスチャをサンプリングするために、入力テクスチャ座標を変更せずに渡します。
フラグメントシェーダー は、オブジェクトが画面上で占めるすべての各ピクセルで実行されるプログラムで、通常、各ピクセルの色を計算して出力するために使用します。通常、画面上には何百万ものピクセルがあり、フラグメントシェーダーはそれらのすべてに対して実行されます。フラグメントシェーダーの最適化は、ゲームパフォーマンス全体に関わる非常に重要な部分です。
いくつかの変数または関数の定義の後には、セマンティクスシグニファイア (例えば、:POSITION または : SV_Target) を付けます。セマンティクスシグニファイアは、変数の “意味” を GPU に伝えます。詳細は、シェーダーセマンティクス のページを参照してください。