0

レンダリング パイプラインにおけるシェーダーの位置については基本的に理解していますが、シェーダーの実際の記述についてはほとんどまたはまったく知りません。ここここから取得した CG シェーダーがあります。これらのシェーダーを GLSL に変換しようとしています。リファレンス ドキュメントを調べたところ、言語が非常に似ていることがわかり、利用可能なメソッドと構文に基づいて明らかなすべてのビットを変換しました。ただし、パラメーターのデフォルト値に問題があります。このWebページに基づく行:

float4 iPos     : POSITION,

、「セマンティック」を介してデフォルト値を設定していることを意味します。これは私が迷子になり始めているところです。何かが欠けていない限り、GLSLでは同じことが利用できないようです。GLSL で最も近い類似点が何であるか、または変換作業にとってそれが何を意味するのかがわかりません。シェーダーを変換するときに、これを適切に説明するにはどうすればよいですか?

4

1 に答える 1

1

In Cg セマンティクスは、特定の組み込みの固定機能属性と変数を使用して、属性と変数をエイリアスする方法です。Cg アトリビュートは何よりもまず、セマンティックのない一般的な頂点アトリビュートです。しかし、OpenGL では (古い非推奨の OpenGL のみ)、セマンティックを運ぶ特定の固定関数属性があります。たとえば、頂点の位置はglVertexまたはglVertexPointerで設定され、頂点の法線はglNormalまたはで設定されglNormalPointerます。以前は単純なジェネリック属性にセマンティックPOSITIONまたはNORMALCg を与えることで、そのような固定機能属性チャネルからの値をソースにすることができます。

gl_VertexGLSL には、非推奨の固定関数属性の値を含む組み込みの頂点属性変数がありますgl_Normal。しかし、前述のように、これらの固定機能属性チャネルは実際には非推奨であり、最新の OpenGL での使用は推奨されていません (または、コア プロファイルでさえ禁止されています)。代わりに使用する必要があるのは、glVertexAttribおよびで設定される一般的な頂点属性ですglVertexAttribPointer。それらは実際のセマンティックを持たず、特定の方法でそれらを使用するシェーダーによってのみセマンティックを取得します。しかし、古いアプリケーションを Cg から GLSL に移植する必要がある場合は、 or などの非推奨の組み込み属性を使用することが、gl_Vertexorgl_Normalなどの Cg の属性セマンティクスの最適な代替手段POSITIONですNORMAL

POSITION同様に、clip-space の位置 (セマンティック?)のように、特別な意味を持ち、特別に処理する必要がある特定の変数があります。gl_Positionこれらは、この場合のように、頂点シェーダーで書き込むことができる特別な可変変数に対応しています。gl_TexCoord[i]また、非推奨の OpenGL には、やセマンティックなど、特定の固定関数の可変に対応する、書き込み可能な他の可変変数もありますTEXCOORDi。これらを使用すると、シェーダーを固定機能のステージと簡単に接続できます。たとえば、頂点シェーダーを使用して固定機能のフラグメント処理を行うことができます。

したがって、これらの Cg セマンティクスを要約すると、GLSL の事前定義された特別な属性とさまざまな変数に実際に対応します。しかし、最新の OpenGL では、それらの特別な頂点属性のすべてと、これらの特別な可変変数のほとんどはもう存在しません。しかし、最初に GLSL と Cg が実際にどのように機能するかをもう少し深く掘り下げることをお勧めします。なぜなら、これら 2 つの間の移植はいくつかのキーワードを置き換えるほど単純ではないからです。

于 2013-07-02T10:39:27.637 に答える