5

私のゲームでは、状況ごとに個別の GLSL シェーダーを作成したいと考えています。たとえば、3 つのモデルがありcharactershiny swordblury ghostを に設定し、次にとを設定しrenderShader、最後にとを設定したいとします。animationShaderlightingShadercharacterrenderShaderlightingShaderspecularShadershiny swordrenderShaderlightingShaderblurShaderblury ghost

は頂点のrenderShader位置を投影、ワールド、およびその他のマトリックスで乗算する必要があり、フラグメント シェーダーは単純にモデルにテクスチャを設定する必要があります。

animationShader指定されたボーン変換によって頂点を変換する必要があります。

lightingShader照明をspecularLighting行い、鏡面照明を行う必要があります。

blurShaderぼかし効果を行う必要があります。

まず、異なるシェーダーで複数の頂点変換を行うにはどうすればよいですか? はanimationShader頂点のアニメーション化された位置を計算し、renderShaderその位置を取得していくつかの行列で変換する必要があるためです。

次に、別のシェーダーでフラグメントの色を変更するにはどうすればよいですか?

基本的な考え方は、状況/効果ごとに異なるシェーダーを使用できるようにしたいということですが、それを実現する方法がわかりません。

これらのシェーダーを opengl で使用する方法と、GLSL を使用してすべてのシェーダーが互いに完成し、シェーダーが別のシェーダーが使用されているかどうかを気にしないようにする方法を知る必要があります。

4

3 に答える 3

4

あなたが求めているのは明らかに自明ではなく、あなたが説明する「シェーダー」タイプの数が比較的限られているため、おそらく極端にやり過ぎです。

やりたいことを実行するには、効果的に独自のシェーディング言語を開発する必要があります。#defineGLSLの高度なバージョンかもしれませんが、作成するシェーダーは純粋な GLSL ではありません。それらには特殊なフックがあり、コードが他のコードに流れ込むと予想される方法で記述されます。

言語の入力と出力を指定する独自の方法が必要です。シェーダーを接続する場合、誰の出力がどのシェーダーの入力に接続されるかを指定する必要があります。一部の入力は実際のシェーダー ステージ入力から取得できますが、他の入力は他のシェーダーから取得できます。シェーダーによって書き込まれる出力には、実際のシェーダー ステージの出力となるものもあれば、他のシェーダーに供給するものもあります。

したがって、別のシェーダーからの入力を必要とするシェーダーは、その別のシェーダーの後に実行する必要があります。システムは、依存関係グラフを作成する必要があります。

特定のシェーダー シーケンスのすべての入力と出力を把握したら、それらのシェーダー テキスト ファイルをすべて取得し、必要に応じて GLSL にコンパイルする必要があります。明らかに、これは重要なプロセスです。

シェーダー言語は次のようになります。

INPUT vec4 modelSpacePosition;
OUTPUT vec4 clipSpacePosition;

uniform mat4 modelToClipMatrix;

void main()
{
  clipSpacePosition = modelToClipMatrix * modelSpacePosition;
}

「コンパイラ」はこれに対してテキスト変換を行い、必要に応じて参照をmodelSpacePosition実際の頂点シェーダー入力または別のシェーダーによって書き込まれた変数に変換する必要があります。同様に、clipSpacePositionを に書き込む場合は、のすべての使用をにgl_Position変換する必要があります。また、明示的な出力宣言を削除する必要があります。clipSpacePositiongl_Position

要するに、これは大変な作業になります。

これを行う場合は、頂点シェーダーとフラグメント シェーダーの概念を統合しようとしないことを強くお勧めします。このシェーダー システムは、明確に定義されたシェーダー ステージ内で動作し続けます。したがって、「lightingShader」は、頂点シェーダーまたはフラグメント シェーダーのいずれかである必要があります。フラグメント シェーダーの場合、それにフィードする頂点シェーダー内のシェーダーの 1 つが何らかの方法で法線を提供する必要があります。または、フラグメント シェーダー コンポーネントが何らかのメカニズムを介して法線を計算する必要があります。

于 2013-04-18T11:04:57.717 に答える