0

OpenGLトランスフォーム フィードバックを使用したいくつかのから、glTransformFeedbackVaryings がプログラムのコンパイル後、リンク前にマップされていることがわかります。私のコード シェーダー プログラムでは、作成プロセスが他のルーチンから抽象化されており、それを制御可能なコンパイル/リンク メソッドに分割する前に、回避策があるかどうか知りたいので質問しています。

アップデート:

分離可能なシェーダー オブジェクトを使用する場合、どのように行われますか?明示的なリンケージ ステップはありません。

アップデート:

個別のシェーダー オブジェクトを使用する場合に glTransformFeedbackVaryings を設定する方法はまだ明確ではありません。

この説明は私には完全に不明確です:

分離可能なプログラム オブジェクトが使用されている場合、キャプチャされた属性のセットは、トランスフォーム フィードバックによってキャプチャされたプリミティブを処理する最後のシェーダー ステージでアクティブなプログラム オブジェクトから取得されます。前のシェーダー ステージでアクティブな他のプログラムのトランスフォーム フィードバック モードでキャプチャする属性のセットは無視されます。

実際、パイプライン オブジェクトをアクティブにしてクエリを実行できると思っていましたが、効果がないようです。変換フィードバックには何も書かれていません。その後、Transform Feedback docsで次の議論を見つけました。

glCreateShaderProgramEXT で作成した別のシェーダー プログラムから変数を出力できますか?

    RESOLVED:  No.

    glTransformFeedbackVaryings requires a re-link to take effect on a
    program.  glCreateShaderProgramEXT detaches and deletes the shader
    object use to create the program so a glLinkProgram will fail.

    You can still create a vertex or geometry shader program
    with the standard GLSL creation process where you could use
    glTransformFeedbackVaryings and glLinkProgram.

これも不明です。答えは、トランスフォーム フィードバック変数を設定するには、通常のシェーダー プログラムのみを使用する必要があるということですか?わかりません。

4

1 に答える 1

1

残念ながら、それは4.4.2.1 Transform Feedback Layout QualifiersOpenGL 4.4 の機能です。を通じて拡張形式で利用できますGL_ARB_enhanced_layoutsが、これは比較的新しい拡張機能であり、現時点では採用はまばらです。

これは、GLSL の従来のレイアウト修飾子のどれよりもかなり複雑であるため、当面の最善の策は、シェーダーではなく GL API から変数を管理することです。


SSO (分離可能なシェーダー オブジェクト) プログラムのバリエーションに関する限り、OpenGL 仕様には次のように記載されています。

OpenGL 4.4 (コア プロファイル) - 13.2 変換フィードバック - pp. 392

分離可能なプログラム オブジェクトが使用されている場合、キャプチャされた属性のセットは、トランスフォーム フィードバックによってキャプチャされたプリミティブを処理する最後のシェーダー ステージでアクティブなプログラム オブジェクトから取得されます。前のシェーダー ステージでアクティブな他のプログラムのトランスフォーム フィードバック モードでキャプチャする属性のセットは無視されます。

in通常、リンクは、ステージ間で実際に使用される変数 (最新の GLSL では/で示されるout) を識別し、GLSL プログラムの「アクティブな」ユニフォームのセットを確立します。リンクは、複数のステージ間で共有されていない自重を調整し、ステージ間で静的なインターフェイス検証を実行します。また、残りの変動またはユニフォームのバインディング位置が設定されるときでもあります。SSO を使用する場合、各プログラム オブジェクトは 1 つのステージである可能性があるため、リンカは入力/出力 (可変) の数を減らすことはなく、リンクの前または後に発生する必要があるという仕様内の多くの言語を無視できます。

リンクは、個別のシェーダー オブジェクトで使用するプログラム オブジェクトを作成する手順ではないため、トランスフォーム フィードバックは単一のステージに関連している必要があります (これは、選択したステージに応じて異なるプログラム オブジェクトを意味する可能性があります)。OpenGL は、この目的のために、パイプラインで有効化された最終頂点処理ステージに関連付けられたプログラムを使用します。これは、頂点シェーダー、テッセレーション評価シェーダー、またはジオメトリ シェーダー (この順序で) の可能性があります。パイプラインの最終的な頂点処理ステージを提供するプログラムは、変換フィードバック変動が関連するプログラム オブジェクトです。

于 2013-09-28T15:50:50.950 に答える