5

頂点シェーダーを使用して、レンダリングされた出力を生成せずにバッファーを処理することに興味があります。関連するスニペットは次のとおりです。

glUseProgram(program);

GLuint tfOutputBuffer;
glGenBuffers(1, &tfOutputBuffer);
glBindBuffer(GL_ARRAY_BUFFER, tfOutputBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*4*3, NULL, GL_STATIC_READ);

glEnable(GL_RASTERIZER_DISCARD_EXT);

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfOutputBuffer);
glBeginTransformFeedbackEXT(GL_TRIANGLES);

glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
glEnableVertexAttribArray(positionAttribute);
glVertexAttribPointer(positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(double)*4, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);

glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, 0);

glDrawElements()これは、呼び出しまで正常に機能し、 GL_INVALID_FRAMEBUFFER_OPERATION. そしてglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);戻りますGL_FRAMEBUFFER_UNDEFINED

これは、私の GL コンテキストにデフォルトのフレームバッファがなく、別の FBO をバインドしていないためだと思います。しかし、レンダリングされた出力は気にせず、有効GL_RASTERIZER_DISCARD_EXTにしたので、フレームバッファは必要ないと思いました。

それで、 framebuffer なしで変換フィードバックを使用する方法はありますか、またはその内容を気にしなくても、フレームバッファを生成してバインドする必要がありますか?

4

1 に答える 1

5

仕様によると、これは実際には完全に有効な動作です。

OpenGL 4.4 コア仕様- 9.4.4 フレームバッファ操作に対するフレームバッファの完全性の影響

framebuffer completeGL_INVALID_FRAMEBUFFER_OPERATIONではないフレームバッファに対してレンダリングまたは読み取りを試みると、エラーが生成されます。このエラーは、フラグメントが実際にフレーム バッファから読み取られるか、フレーム バッファに書き込まれるかに関係なく生成されます。たとえば、レンダリング コマンドが呼び出され、フレーム バッファが不完全な場合に、が有効になっていても生成されます。GL_RASTERIZER_DISCARD

これを回避するには、1 ピクセルのカラー アタッチメントを使用して FBO を作成し、それをバインドする必要があります。完全な FBO をバインドする必要があります。そうしないと、完全性を確保するGL_INVALID_FRAMEBUFFER_OPERATIONためのルールの 1 つとして、少なくとも 1 つの完全なイメージを添付する必要があります。

実際、OpenGL 4.3 では、いかなる種類の添付ファイルも持たない FBO を定義することで、この問題を回避できます (を参照GL_ARB_framebuffer_no_attachments)。ただし、FBO と変換フィードバックの EXT 形式を使用しているため、4.3 の実装があるとは思えません。

于 2014-06-09T02:14:35.170 に答える