7

OpenGLの新しいバージョン(3.0および4.0以降)では、gl_Vertexなどの組み込みの頂点属性は非推奨になっています。実際に何かをレンダリングする「新しい方法」は、位置や色などの独自の頂点属性を指定してから、これらのカスタム属性をバッファーにバインドすることです。

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

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

4

3 に答える 3

3

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

つまり、シェーダーで古い名前を維持するのは便利であり、現在のGLSLコンパイラーで機能するようです。安全を確保したい場合は、プリプロセッサを使用してプレフィックスのgl_予約名を自分で選択したプレフィックスに書き換え、そのプレフィックスをバインドします。

于 2011-01-12T08:43:15.280 に答える
1

まず、あなたの質問に答えます。私はそのような標準的な命名規則を知りません。

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

そして、固定されたgl_名から私が学んだことは、それらがセマンティクスを過小指定しているということです。

  • gl_Positionはどのスペースにありますか?(回答:ホストが渡したものに完全に依存します。エンジンは、さまざまな理由でワールドスペースが必要なため、すでに変換されている場合など、ローカルスペースであるものを渡す必要はありません)。
  • gl_TexCoord1はテクスチャ座標ですか、それとも実際には接線ですか?その範囲はどうですか?エンコードされていますか?

これらすべての問題に実際に対処する特定の命名法が見つかるかどうかは明らかではありませんが、さまざまなエンジンを互換性のあるものにする必要があります。

さらに問題なのは、特定のエンジン(または特定のアセット)が、別のエンジンからのシェーダーに必要な特定の属性を提供する機能を備えていることさえ明らかではないということです。では、どうしますか?

これらはすべて、バルカニゼーションされたシェーダー環境になってしまう理由です。

于 2011-01-12T09:54:49.753 に答える
0

属性/統一セマンティクスの可能な実装のリストについては、私の質問を参照してください。OpenGL 3.4を使用しても、この問題は解決されないのではないかと思います。シェーダーとコードの間のコントラクトを定義するのは、ほとんど自分のデバイスに任されています。

于 2011-06-13T11:33:49.813 に答える