2011-01-12 3 views
5

新しいOpenGL(3.0および4.0)の新バージョンでは、のgl_Vertexのようなビルトインの頂点属性は非推奨のです。実際にレンダリングする「新しい方法」は、位置、色などの独自の頂点属性を指定し、これらのカスタム属性をバッファにバインドすることです。最新のOpenGLシェーダは、相互に互換性を持たせるためにどのように書き込まれるべきですか?

私の質問はこれです:どのようにレンダリングコードとシェーダを密接に結合せずにこれを行うことができますか? 「位置」を頂点の位置として使用するシェーダーを記述する場合、シェーダーを使用するホストコードはそれを知っていて、頂点データを「位置」として渡す必要があります。私が "vertex_pos"で頂点データを取るために書かれた別のシェーダを使用したいのであれば、そのシェーダを最初に書き直すか、代わりに頂点データを "vertex_pos"として送るようホストコードを変更する必要があります。

すべてのシェーダが使用する標準の頂点属性とフラグメント属性のベストプラクティス名がありますか?または、あるエンジン用に書かれたシェーダーが修正なしに別のエンジンで動作しないように、バルカン付エンジン固有の標準がありますか?あるいは、一般的に、すべてのオブジェクトがカスタムシェーダと一致する独自のレンダリングコードを必要とするなど、標準が全くありませんか?

答えて

3

名前をそのまま旧名と呼んでください。コアプロファイルがある場合(つまり下位互換性がない場合)、古いGLSL仕様の予約済みの名前はで、無効と宣言されたが解放されます。バインディングの頂点属性を再宣言します。可用性属性を変更しているようです。互換性プロファイルでは、これらの変数名が事前に割り当てられ、バインドされています。

これは次のとおりです。シェーダに古い名前を付けることは便利で、現在のGLSLコンパイラで動作するようです。あなたが安全に行きたい場合は、プリプロセッサを使用してgl_プレフィックス予約名を自己選択プレフィックスに書き換え、それをバインドします。

+2

実際、そうではありません。 GLSLは** gl_で始まる任意の**名前を予約します。コアコンパイラで "gl_Vertex"を使用できる場合は、仕様に準拠していません。 1.50仕様は、宣言された型のプロパティを変更するためにのみ有効な再宣言構文を明確にしています。だから、あなたもそれらを再宣言するべきではありません。 –

+0

@Nicol:ここで言語の法則が始まります:一部の人は、推奨されていない変数名を互換性プロファイルのあらかじめ定義された識別子と見なし、1.50 GLSLプログラムでそれらを使用すると再宣言を変更します。 IMHO仕様はこれについてはっきりしていませんが、 '#version'の§3.3はコアが「互換性名が利用できません」という意味であるようです。安全なものにしたいなら、彼はプリプロセッサ '#define gl_Vertex glVertex'を使用し、その名前をコアプロファイルで使用できます。 – datenwolf

1

まず、あなたの質問にお答えします。私はそのような標準命名規則を知らない。

しかし、それは属性名より複雑です。疑問のもとに隠されているのは、属性意味論の概念です。各入力属性は、各シェーダが期待する何らかの形式のセマンティクスを持っています。

そして、固定されたgl_名から学んだのは、彼らが意味論を過小に指定しているということです。

  • gl_Positionにはどのスペースがありますか? (答え:それはホストが何を渡したかに完全に依存します。エンジンはローカル空間であるものを渡す必要はありません。
  • は、gl_TexCoord1ではテクスチャ座標ですか、実際は接線ですか?その範囲はどうですか?エンコードされていますか?

これらの問題に実際に対応している特定の命名法が見つかる可能性はありませんが、さまざまなエンジンに互換性を持たせる必要があります。

さらに問題がありますが、特定のエンジン(または特定のアセット)が、異なるエンジンからのシェーダに必要な特定の属性を提供する機能を持つことさえ明らかではありません。それでは?

これらはすべてバルカン化されたシェーダ環境になる理由です。

+0

OpenGL仕様は、何がうまく通っているのかについてはっきりとしており、ユニフォームと属性をよく知っています。接線を指定するためのgl_TexCoord1の乱用のようなものは、使用可能な頂点属性が限られていて、他の手段でデータを渡さなければならなかった時代の起源です。入力OpenGL 4では、特別な名前はまったく指定されていませんが、すべて自由に名前を付ける頂点属性ですが、もちろん出力名も明確に定義する必要があります。標準行列であっても、すべての行列を制服で指定する必要があります。 – datenwolf

+1

@datenwolf:私の要点は、GLがシェーダーを提供するとすぐに、入力の意味がGLのものではなく、ホストの責任となることです。これはgl_ *変数を使用しても当てはまります。シェーダが別のエンジンで動作することを保証するものではありません。私は、たとえそれが提供される必要があるとしても、Positionを消費しないシェーダを見てきました。 – Bahbar

+0

この意味の喪失は、OpenGL-3/4コアがあらかじめ定義された入力変数を持たない理由です。ジェネリックな頂点属性のみを扱うので、好きなように自由に呼び出すことができます。いずれの高度なレンダリング技法もエンジンによって制御されるいくつかのレンダリングパスに依存するため、シェーダはその根底にあるレンダリングエンジンに結びついています。そしてシェイダーはそのパスに合うように書かなければなりません。 – datenwolf

0

属性/統一セマンティクスの可能な実装の一覧については、questionを参照してください。私はOpenGL 3.4でもこの問題は解決されず、シェイダーとコードの間の契約を定義するためにあなたのデバイスにほとんど残っています。

関連する問題