Unity Shaderについて一から理解できるようお手伝いします

序文

Shader、中国語でシェーダーと呼ばれるものは、多くの開発者にとって、学びたくても学び方が分からなかったり、しばらく学んでもGetできなかったりする謎の存在です。それは外にあり、それを行う方法がないということです。

はい、ゲーム開発交流グループがあります。皆さんもクリックして開発経験を交換していただければ幸いです

そこで今日この記事では、Shader を最初から始める方法を説明します。その目的は、Shader を初めて使用するプログラマやアーティストがすぐにこのカラフルな世界に参入できるようにすることです。

1. シェーダーとは

シェーダーは実際にはグラフィックのレンダリングに特化したテクノロジーであり、シェーダーを通じてグラフィック カードのアルゴリズムをカスタマイズして画像をレンダリングし、希望する効果を実現できます。それは、ゲームでよく見られる次の 2 つの効果のように、すべてのピクセルから画面全体に及びます。

2. シェーダの分類

頂点シェーダー (3D グラフィックスは三角形パッチで構成されます。頂点シェーダーは各三角形パッチの頂点を計算し、最終的なピクセル レンダリングの準備をします)。

名前が示すように、ピクセル シェーダーは、ピクセル単位で照明と色を計算する一連のアルゴリズムです。

いくつかの異なるグラフィックス API には独自のシェーダー言語があります。DirectX では、頂点シェーダーは頂点シェーダー、ピクセル シェーダーはピクセル シェーダーと呼ばれます。OpenGL では、頂点シェーダーは頂点シェーダーとも呼ばれますが、ピクセル シェーダーはフラグメント シェーダーと呼ばれます。 、これはフラグメント シェーダーまたはフラグメント シェーダーとよく呼ばれるものです。

率直に言うと、Shader は実際にはコードの一部であり、このコードの機能は、モデルの各頂点の色、最終的には各ピクセルの色を描画する方法を GPU に指示することです。

3. シェーダプログラミング言語

Shader はコードの一部であるため、言語で記述する必要があります。現在主流の言語は 3 つあります: OpenGL に基づく OpenGL Shading Language (GLSL と呼ばれます)。 DirectX に基づく高レベル シェーディング言語 (HLSL と呼ばれます)。 Cg 言語と呼ばれる NVIDIA の C for Graphic もあります。

GLSL と HLSL はそれぞれ OpenGL と Direct3D に基づいたインターフェイスであり、この 2 つを混合することはできません。 Cg 言語はグラフィックスに使用される C 言語ですが、これにはグラフィックス ハードウェアをベースにしたプログラミングを C 言語プログラミングと同じくらい便利で自由にしたいという当時の設計者の意図が表れています。

C++ と Java の構文が C に基づいているのと同様に、Cg 言語自体も C 言語に基づいています。 C、C++、Java のいずれかを使用したことがある場合は、Cg の構文を習得するのは比較的簡単です。 Cg 言語は、C 言語のセマンティクスのほとんどを保持し、開発者をハードウェアの詳細から解放するよう努めており、コードの再利用の容易さや可読性の高さなど、高級言語の利点も備えています。 Cg 言語は、標準のハードウェア ライティング言語の構文とセマンティクスについて合意に達するために Microsoft と NVIDIA が共同で作成したものであるため、HLSL と Cg は実際には同じ言語です。

一般的に、クロスゲーム プラットフォームの利便性を考慮して、CG 言語を学習するのが一般的です。

4.Unityシェーダーとは

グラフィックス カードには、NVIDIA、ATI、Intel などが含まれます。グラフィックス API には、OpenGL、DirectX、OpenglES、Vulkan、Metal などが含まれます。シェーダー プログラミング言語には、GLSL、HLSL、Cg などが含まれます。

ちょっとめまいがするけど、どうやって選べばいいの? Unityではどうやってやればいいのでしょうか?

実際、Unity ではすべてがよりシンプルになり、必要な効果を実現する方法だけを考慮する必要があり、残りはすべて Unity によって自動的に処理されます。 Unity で作成したシェーダーは、最終的にはさまざまなプラットフォームに応じてさまざまなシェーダー言語にコンパイルされるため、Unity でシェーダーを作成するにはどの言語を使用すればよいでしょうか?

公式の推奨事項は、Cg/HLSL を使用してシェーダー プログラムを作成することです。もちろん、GLSL を使用することもできます。これは主に、Cg/HLSL の方が優れたクロスプラットフォーム機能を備えており、シェーダー プログラムの作成には Cg/HLSL を使用することを好むためです。

厳密に言えば、Unity Shader は従来の Shader ではなく、Unity 自体によってカプセル化された簡単に作成できる Shader (ShaderLab とも呼ばれます) です。 Unity のシェーダーは 3 種類あります (実際には 3 つの異なる書き方): サーフェイス シェーダー; 頂点/フラグメント シェーダー; 固定関数シェーダー; 固定関数シェーダーが完全に排除されました。 Surface Shader は、実際には Unity の Vertex/Fragment Shader のパッケージングの別のレイヤーであるため、Shader の作成方法は人間の思考モードにより一致し、同時に、異なる照明モデルや異なるプラットフォームで考慮する必要がある事項にも適合します。非常に少ないコードで完了できます。

ただし、Surface Shader にも限界があり、Vertex/Fragment Shader で実現できる効果は Surface Shader では実現できない場合があり、逆に、Surface Shader で実現できる Vertex/Fragment Shader は確実に実現できます。

そして、Unity 2018 以降のバージョンでは、Unity の公式ビジュアル シェーダー ツール (シェーダー グラフ) がリリースされました。生成されたコードから判断すると、すべて Vertex/Fragment Shader を使用していますが、将来のプログラマブル レンダリング パイプラインでは、Unity 自体が Surface Shader を放棄し、すべて Vertex/Fragment Shader を使用することになると理解できますか?

つまり、将来の学習プロセスでは、いくつかのサーフェイス シェーダー コンテンツも含まれますが、主に頂点/フラグメントに焦点を当てます。

さらに、Shader を学習すると、ゲーム内でモデルがピンク色に表示される、Shader が見つからない、Shader が現在のプラットフォームを満たしていない、または文法上の誤りがあるという状況に遭遇したことがあるはずです。シェーダー、毛織物?シェーダを理解して学べば、これらの質問はもう混乱することはありません。

組み込みの Unity Shader は「普遍的な」使用例にすぎず、すべての画面パフォーマンスのニーズを満たすには十分ではありません。

シェーダをマスターすると、ゲームやアプリケーションに独自の視覚的な楽しみを生み出すことができます。実際のニーズに基づいてゲームやアプリケーション向けの特定の機能を実装するシェーダー。

Shader は何をどのようにレンダリングするかを制御できるため、レンダリング パフォーマンスの最適化に非常に役立ちます。

シェーダーを作成する能力はゲーム チームにとって非常に重要であり、シェーダー スキルの開発は常に注目を集めています。現在、議論の余地のない事実は、大手メーカーにとってテクニカル アートは常に希少なリソースであるということです。

5. シェーダーのコア知識

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

レンダリング パイプラインとも呼ばれ、グラフィックス信号を処理するディスプレイ チップ内の独立した並列処理ユニットです。パイプラインは、フロントイン、ラストアウトのプロセスに従って、固定順序で並行して実行できる一連のステージです。たとえると、BMW とベントレーの車を同時に生産する工場のようなもので、2 台の車の各部品が同時に生産され、このワークショップには 2 つの異なるレンダリング パイプラインがあると言えます。

上の図をもとに説明します。 3D ソフトウェアまたはゲームが実行されると、グラフィックス API、OpenGL、または DirectX が呼び出されます。頂点シェーダーとフラグメント シェーダーはすべて、図の GPU 操作ボックスで動作します。

上の写真は Unity エンジンを対象としたものです。ジオメトリの部分はモデリングとして理解できます。このプロセスは、メッシュ データを Unity にインポートすることであり、Unity エンジンはグラフィックス API を呼び出します。グラフィックス API を呼び出すプロセスは、GPU を駆動して処理操作を実行することです。

GPU に入った後、最初に行われるのは頂点プロセッサに対応する頂点シェーダーであり、頂点演算の結果はピクセル シェーダーに対応するピクセル プロセッサ (ピクセル プロセッサはフラグメント プロセッサに相当) に渡されます。 (つまり、フラグメント シェーダ)、最後に画面上に表示できるピクセル情報を出力するフレーム バッファ (フレーム バッファ) には、色情報だけでなく深度値も格納できます。

2.シェーダーマテリアルマップ

シェーダは実際には小さなプログラムであり、指定された方法で入力頂点データと入力テクスチャまたはカラーを組み合わせて出力する役割を果たします。描画ユニットはこの出力を使用して画像を画面に描画できます。

入力されたテクスチャやカラーなどに加えて、対応するシェーダ、およびシェーダの特定のパラメータ設定がパッケージ化されて保存されます。その結果がマテリアル (マテリアル) です。実際には、他にもベクトルやベクトルなどがあります。行列。その後、マテリアルを 3D モデルに割り当ててレンダリング (出力) します。

マテリアルはゲーム エンジンで最終的に使用される製品のようなもの、シェーダーはそのような製品を作成するために使用される処理方法のようなもの、テクスチャはそのような製品の原材料のようなものです。 Unity などのエンジンを使用しない場合、マテリアルを実装するには OpenGL または DirectX API 呼び出しを使用して手動でシェーダーを構成する必要があり、これは非常に面倒なので、エンジンが便利です。

6. Unityにおけるシェーダの記述形式

サーフェスシェーダ頂点とフラグメントシェーダ固定機能シェーダの3種類があります。ハードウェアが頂点シェーディングとフラグメント シェーディングのみを認識することはわかっていますが、なぜ Unity エンジンにサーフェス シェーダー (以下、SS と呼びます) と固定関数シェーダー (以下、FFS と呼びます) が追加されているのでしょうか。

FFS の場合、主に固定パイプライン ハードウェアの操作用です。ほとんどのハードウェアでサポートできる非常に保守的なシェーダーです。SS については、Unity によって推奨されています。Unity でシェーダーを作成する場合、デフォルトのコードは SS です。 。実際、SS は頂点シェーダーとフラグメント シェーダーの「パッケージ」です。SS プログラミング後、Unity は SS コードをハードウェア認識可能な頂点シェーダー コードとフラグメント シェーダー コードにコンパイルします。シェーダー作成の主な構造:

7. シェーダーラボ

ShaderLab は、特にシェーダーを作成するために Unity 用にカスタマイズされた構文であり、他の 3 つのシェーダーに対応できます。 ShaderLab の主な構造:

中括弧内の 3 つの部分: プロパティ、サブシェーダー、フォールバック。プロパティとは何ですか? プロパティ。 Unity で新しいシェーダーとシェーダーを作成し、コンパイラーを開いてシェーダーに「111」という名前を付けます。次に 111shader をシェーダーにドラッグし、シェーダーをクリックしてその表示とコード内のプロパティの内容を確認します。シェーダープログラミングのプロパティでは、パラメーター調整のためにシェーダーのマテリアルボールのプロパティをリスト形式で表示することがわかりました。

サブシェーダとは何ですか? アルゴリズムは GPU レンダリング用に書かれたシェーダ フラグメントです。ここで、シェーダには少なくとも 1 つのサブシェーダがあることを覚えておいてください。グラフィックス カードが処理を実行するたびに、実行するサブシェーダを 1 つだけ選択できます。では、なぜ複数のサブシェーダーがあるのでしょうか?これはハードウェアに関係があります。

シェーダーを読み取るときは、最初に最初のサブシェーダーから読み取ります。最初のサブシェーダーが現在のハードウェアに適応できる場合は、それ以降は読み取られません。ハードウェアが古すぎて対応できない場合は、最初のサブシェーダーを読み取ることができません。 2冊目も読んで自分に合うかどうか確認してみます。言い換えれば、すべてのサブシェーダ ソリューションは下方向に単純化されます。リストされているサブシェーダーがどれも使用できない場合はどうなりますか?それが 3 回目のフォールバックです。

FallBack は、サブシェーダーが使用できなくなったときに、指定された Unity に適応できるシェーダーにロールバックできることを意味します。 Unity で一般的に使用される組み込みシェーダーは次のとおりです。

その他のビデオチュートリアル

Unity3D チュートリアル www.bycwedu.com/promotion_channels/2146264125

おすすめ

転載: blog.csdn.net/Thomas_YXQ/article/details/134525982