[解決済み] glBlitFramebufferを使用してテクスチャを表示する
質問
シンプルなマルチパスレンダリングスキームを実装しようとしています。まず、シーンのマルチサンプル版をFBOにブリットしています。
beforeEffectsContext.fbo
. 次に、これをアプリケーションが提供するFBにブリットすると、うまく動作します。しかし、シーンをぼかすために、もう1つのパスを実行したいのです。そこで、テクスチャを
COLOR_ATTACHMENT0
での
beforeEffectsContext.fbo
を作成し、別のフレームバッファにブラー効果を追加したクワッドを描画して、それをサンプルにします。
blurContext.fbo
.
の内容を表示することができれば
blurContext.fbo
のカラーアタッチメントを画面に表示させるために、同じ手法でクワッドとテクスチャサンプリングを使用すると、うまくいって、ぼやけたシーンが得られます。
しかし、もし私が
glBlitFramebuffer()
このステップでは、代わりに黒いスクリーンが表示されます。この問題は、ブリッティングプロセスとFBOに対する私の誤解にあるようです。
の初期化コード
blurContext.fbo
:
// BeforeEffects Framebuffer
glGenFramebuffers(1, &renderContext->beforeEffectsContext.fbo);
glBindFramebuffer(GL_FRAMEBUFFER, renderContext->beforeEffectsContext.fbo);
glGenTextures(1, &renderContext->beforeEffectsContext.colorAttachment);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, renderContext->beforeEffectsContext.colorAttachment);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 0, GL_RGBA, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderContext->beforeEffectsContext.colorAttachment, 0);
// Blur Framebuffer
glGenFramebuffers(1, &renderContext->blurContext.fbo);
glBindFramebuffer(GL_FRAMEBUFFER, renderContext->blurContext.fbo);
glGenTextures(1, &renderContext->blurContext.colorAttachment);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, renderContext->blurContext.colorAttachment);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 0, GL_RGBA, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderContext->blurContext.colorAttachment, 0);
レンダリング中です。
// Draw to the MSampled scene to the BeforeEffects framebuffer
glBindFramebuffer(GL_READ_FRAMEBUFFER, renderContext->multiSamplingContext.fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, renderContext->beforeEffectsContext.fbo);
glBlitFramebuffer(0, 0, 800, 600, 0, 0, 800, 600, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
// Sample the texture attached to the beforeEffects FBO and draw to the blur FBO
glBindTexture(GL_TEXTURE_2D, renderContext->beforeEffectsContext.colorAttachment);
glBindFramebuffer(GL_FRAMEBUFFER, renderContext->blurContext.fbo);
glViewport(0, 0, 800, 600);
glUseProgram(renderContext->blurProgramContext.program);
glBindVertexArray(renderContext->vaoBlur);
glDrawArrays(GL_QUADS, 0, 4);
glUseProgram(0);
glBindVertexArray(0);
// Blit the content of the blur FBO to the app-provided Framebuffer (doesn't work, black screen)
glBindFramebuffer(GL_READ_FRAMEBUFFER, renderContext->blurContext.fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_DRAW_BUFFER, 0);
glViewport(0, 0, 800, 600);
glBlitFramebuffer(0, 0, 800, 600, 0, 0, 800, 600, GL_COLOR_BUFFER_BIT,
GL_NEAREST);
解決方法は?
デフォルトのフレームバッファ(0)を描画にバインドしている行では、ターゲットが GL_DRAW_BUFFER になっています。これによると https://www.opengl.org/sdk/docs/man/html/glBindFramebuffer.xhtml 描画フレームバッファを設定するための正しい enum は GL_DRAW_FRAMEBUFFER です。もし、glGetErrorの呼び出しを追加すると、おそらくGL_INVALID_ENUMエラーが表示されるでしょう。
関連
-
[解決済み] Emscripten/OpenGLのコードで「glDrawArrays: attribute 1の範囲外の頂点にアクセスしようとする」(ネイティブC++では動作する) [終了しました]
-
[解決済み] glGetShaderiv() GL_COMPILE_STATUS GL_FALSE を返す
-
[解決済み] OpenGL - GLenumはどのように符号なし32ビット整数ですか?
-
[解決済み] コンセプト:glDrawBufferとglDrawBuffersの使い分けは?
-
[解決済み] glDeleteBuffers()はいつ呼び出すべきですか?
-
opengl glGetIntegerv エラーを使用します。アクセス違反 ロケーション0x0000000000000000を実行中
-
[解決済み] OpenGL - glDepthMaskの使い方についての質問です。
-
[解決済み] glActiveTextureとglBindTextureの違いと関係
-
[解決済み] バーテックスシェーダとフラグメントシェーダの比較 [重複].
-
[解決済み] OpenGLでglLoadIdentity()は何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み] X リクエストが失敗したときのエラー。BadValue (整数パラメータが操作の範囲外です)
-
[解決済み] glGetShaderiv() GL_COMPILE_STATUS GL_FALSE を返す
-
[解決済み] gl_FragColorとout vec4カラーを使用する?
-
[解決済み] 最新のOpenGLで複数のテクスチャをレンダリングするには?
-
opengl glGetIntegerv エラーを使用します。アクセス違反 ロケーション0x0000000000000000を実行中
-
GLMライブラリの概要 glm::transform, glm:scale, glm::rotate
-
[解決済み] FOVXの計算(openGL)
-
[解決済み] GLSLシェーダーの正しいファイル拡張子は何ですか?[クローズド]。
-
[解決済み] OpenGLでglLoadIdentity()は何をするのですか?