1

合計5つのレンダーターゲットがあります。同じシェーダーを使用して最初の4に書き込み、次に別のパスで最後のシェーダーに書き込みます。

最初の4つのターゲットにレンダリングを呼び出す前に、次のように呼び出します。

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,  GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glDrawBuffers(4, drawBuffers);

しかし、2番目のパスを呼び出して、最後のパスである5番目のターゲットにのみ書き込みたい場合、次のように奇妙な結果が得られるのはなぜですか?

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT4 };
glDrawBuffers(1, drawBuffers);

代わりに使用する必要があるのはなぜですか。

GLenum drawBuffers[] = { GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT4 };
glDrawBuffers(5, drawBuffers);

これは単にglDrawBuffers()がどのように機能するのか、それとも他の何かによって引き起こされているのでしょうか?

編集:Jarrodsコメントに関する修正されたコード

4

3 に答える 3

3

はい、これは単にどのようにglDrawBuffers機能するかです。しかし、それには理由があります。

フラグメントシェーダーは、特定の「カラー番号」にマップするカラー出力を書き込みます。これらは、 GL_COLOR_ATTACHMENT''i''番号とは関係ありません。の全体的なポイントglDrawBuffersは、これらのフラグメントの色番号をフレームバッファ内の実際のバッファにマップすることです。

于 2013-02-24T23:30:44.087 に答える
1

http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffers.xml

const GLenum*2番目のパラメーターは、「フラグメントの色またはデータ値が書き込まれるバッファーを指定するシンボリック定数の配列へのポインター」というタイプである必要があります。

GL_COLOR_ATTACHMENT4したがって、2番目のパラメータとして渡すだけではタイプが間違っています。の配列へのポインタを渡す必要がありますGLEnum

于 2013-02-24T22:09:26.207 に答える
0

glDrawBuffers()に何か問題があることがわかりました。たとえば、tmp = {attement_color0、attachement_color2} glDrawBuffers(tmp)の場合。シェーダー内:gl_fragdata [0] = ... gl_fragdata [2] = .. ..

または、レイアウトの場所を使用して、添付ファイルの出力を定義できます。しかし、少なくとも私のPCでは、機能しない場合があります。つまり、attachment_color2には正確な出力がありません。

于 2013-07-23T09:17:13.860 に答える