質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

受付中

opengl bloomの描画手順が正しいのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0回答

0グッド

0クリップ

1224閲覧

投稿2021/12/15 12:07

編集2021/12/17 07:23

提示コードですがbloom効果を実装したいのですが画面に何も表示されず困っています。bloomの描画手順ですが以下の説明で正しいのでしょうか?

描画手順

1,シーンを描画して一つは普通の描画結果で、二つ目は輝度を取得するカラーバッファを作る
2,bloomブラーを付ける
3,ブラーを付けたカラーバッファを最後に描画するカラーバッファにつける。

参考サイト: https://learnopengl.com/Advanced-Lighting/Bloom

描画ループ

cpp

1// ##################################### 初期化 ##################################### 2FrameWork::Camera::Camera() 3{ 4 5 6 7 //カラーバッファ 8 glGenFramebuffers(1, &hdrFBO); 9 glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO); 10 // create 2 floating point color buffers (1 for normal rendering, other for brightness threshold values) 11 glGenTextures(2, colorBuffers); 12 for (unsigned int i = 0; i < 2; i++) 13 { 14 glBindTexture(GL_TEXTURE_2D, colorBuffers[i]); 15 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_RGBA, GL_FLOAT, NULL); 16 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 17 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 18 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // we clamp to the edge as the blur filter would otherwise sample repeated texture values! 19 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 20 // attach texture to framebuffer 21 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, colorBuffers[i], 0); 22 } 23 24 25 //描画行列 26 position = glm::vec3(0,0,1); //座標 27 vecLook = glm::vec3(0,0,-1); //向き(視線) 28 view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); //ビュー行列 29 projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 10000.0f); //透視射形行列 30 31 32 33 sprite.InputTexture(FrameWork::LoadTexture("texture/texture_3.png")); 34 35 glGenFramebuffers(2, pingpongFBO); 36 glGenTextures(2, pingpongColorbuffers); 37 for (unsigned int i = 0; i < 2; i++) 38 { 39 glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[i]); 40 glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[i]); 41 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_RGBA, GL_FLOAT, NULL); 42 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 43 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 44 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // we clamp to the edge as the blur filter would otherwise sample repeated texture values! 45 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 46 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pingpongColorbuffers[i], 0); 47 // also check if framebuffers are complete (no need for depth buffer) 48 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 49 std::cout << "Framebuffer not complete!" << std::endl; 50 } 51 52 53} 54 55 56 57void FrameWork::Camera::Renderer() 58{ 59 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 60 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 61 62 glEnable(GL_DEPTH_TEST); //深度バッファを有効 63 glDepthFunc(GL_LEQUAL); //深度バッファタイプ 64 glEnable(GL_CULL_FACE); //カリングを有効 65 glCullFace(GL_BACK); //裏面を無効 66 67 68 glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 69 glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); 70 71 glClear(GL_DEPTH_BUFFER_BIT); 72 73 //深度バッファレンダリング 74 for(std::vector<std::shared_ptr<Actor>>::iterator itr = actor.begin(); itr != actor.end(); itr++) 75 { 76 (*itr)->Renderer_DepthOnly(getViewProjection()); 77 } 78 79 glBindFramebuffer(GL_FRAMEBUFFER, 0); 80 81 82 glViewport(0, 0, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y); 83 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 84 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 85 glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO); 86 87 88// sprite.Draw_setBloom(getViewProjection_2D(), glm::vec2(0, 0), 0, 0.0f, glm::vec2(1.0f, 1.0f), glm::vec2(0, 0), glm::vec2(100, 100)); 89 90 sprite.Draw_Light(getViewProjection(), glm::vec2(0, 0), 0, 0.0f, glm::vec2(1.0f, 1.0f), glm::vec2(0, 0), glm::vec2(100, 100)); 91 92 sprite.Draw_setBloom(getViewProjection(), glm::vec2(0, 0), 0, 0.0f, glm::vec2(1.0f, 1.0f), glm::vec2(0, 0), glm::vec2(100, 100)); 93 94 glBindFramebuffer(GL_FRAMEBUFFER, 0); 95 96 sprite.Draw_setBlur(quadVAO,quadVBO, colorBuffers[1],pingpongColorbuffers,pingpongFBO); 97 98 99 //ImGui 100 ImGui::Render(); 101 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); 102 103 glBindFramebuffer(GL_READ_FRAMEBUFFER, colorBuffers[0]); 104 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, hdrFBO); 105 glBlitFramebuffer(0, 0, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, 0, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, GL_COLOR_BUFFER_BIT, GL_NEAREST); 106 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 107 glClear(GL_COLOR_BUFFER_BIT); 108 109 glDisable(GL_DEPTH_TEST); 110 111 sprite.Draw_Final(colorBuffers[0], pingpongColorbuffers); 112 113 shaderFrameBuffer->setEnable(); 114 glBindVertexArray(quadVAO); 115 glBindBuffer(GL_ARRAY_BUFFER, quadVBO); 116 glActiveTexture(GL_TEXTURE0); 117 glBindTexture(GL_TEXTURE_2D, colorBuffers[0]); 118 glDrawArrays(GL_TRIANGLES, 0, 6); 119 shaderFrameBuffer->setDisable(); 120 121 glBindVertexArray(0); 122 glBindTexture(GL_TEXTURE_2D,0); 123 glBindFramebuffer(GL_FRAMEBUFFER, 0); 124 125 126 actor.clear(); 127 shadowActor.clear(); 128 129} 130
Sprite
void FrameWork::D2::Sprite::Draw_setBloom(glm::mat4 projection,glm::vec2 pos, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end) { startSize = start; //テクスチャ始点 endSize = end; //テクスチャ終点 setAttribute(); setNormal(); shaderBloom.setEnable(); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex->size(), vertex->data()); setNormal(); setAttribute(); glBindTexture(GL_TEXTURE_2D, textureID.at(texNum)); //テクスチャバインド glActiveTexture(GL_TEXTURE0); //テクスチャ有効 //Transform setPosition(pos); //座標 setScale(s + glm::vec2(end - start)); //スケール setRotate(r); //回転 shaderBloom.setUniform3f("viewPos", glm::vec3(0, 0, 10)); shaderBloom.setUniform3f("light.Position", glm::vec3(0, 0, 1.0f)); shaderBloom.setUniform3f("light.Color",glm::vec3(0,1,0)); //描画 shaderBloom.setUniformMatrix4fv("uTranslate", getMatTranslation()); shaderBloom.setUniformMatrix4fv("uRotate", getMatRotate()); shaderBloom.setUniformMatrix4fv("uScale", getMatScale()); shaderBloom.setUniformMatrix4fv("uViewProjection", projection); glDrawArrays(GL_TRIANGLES, 0, vertex->size()); //描画 shaderBloom.setDisable(); glBindTexture(GL_TEXTURE_2D, 0); //テクスチャバインド glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } void FrameWork::D2::Sprite::Draw_Light(glm::mat4 projection, glm::vec2 pos, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end) { startSize = start; //テクスチャ始点 endSize = end; //テクスチャ終点 setAttribute(); setNormal(); shaderLight.setEnable(); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex->size(), vertex->data()); setNormal(); setAttribute(); //glBindTexture(GL_TEXTURE_2D, textureID.at(texNum)); //テクスチャバインド //glActiveTexture(GL_TEXTURE0); //テクスチャ有効 //Transform setPosition(pos); //座標 setScale(s + glm::vec2(end - start)); //スケール setRotate(r); //回転 shaderLight.setUniform3f("lightColor", glm::vec3(0, 1, 0)); //描画 shaderLight.setUniformMatrix4fv("uTranslate", getMatTranslation()); shaderLight.setUniformMatrix4fv("uRotate", getMatRotate()); shaderLight.setUniformMatrix4fv("uScale", getMatScale()); shaderLight.setUniformMatrix4fv("uViewProjection", projection); glDrawArrays(GL_TRIANGLES, 0, vertex->size()); //描画 shaderLight.setDisable(); //glBindTexture(GL_TEXTURE_2D, 0); //テクスチャバインド glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } void FrameWork::D2::Sprite::Draw_setBlur(const GLuint quadVAO, const GLuint quadVBO,const GLint frameBuffer_Luminance, GLuint pingpongColorbuffers[2], GLuint pingpongFBO[2]) { horizontal = true; bool first_iteration = true; unsigned int amount = 10; shaderBloomBlur.setEnable(); for (unsigned int i = 0; i < amount; i++) { glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[horizontal]); shaderBloomBlur.setUniform1i("horizontal", horizontal); glBindTexture(GL_TEXTURE_2D, first_iteration ? frameBuffer_Luminance : pingpongColorbuffers[!horizontal]); // bind texture of other framebuffer (or scene if first iteration) glActiveTexture(GL_TEXTURE0); //テクスチャ有効 glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER,quadVBO); setAttribute(); //頂点属性 設定 //glDrawArrays(GL_TRIANGLES, 0, vertex->size()); //描画 glDrawArrays(GL_TRIANGLES, 0, 6); //バインド解除 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); horizontal = !horizontal; if (first_iteration) first_iteration = false; } shaderBloomBlur.setDisable(); } void FrameWork::D2::Sprite::Draw_Final(GLuint frameBuffer, GLuint pingpongColorbuffers[2]) { shaderBloomFinal.setEnable(); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, frameBuffer); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[horizontal]); shaderBloomFinal.setUniform1i("bloom", true); shaderBloomFinal.setUniform1f("exposure", 1.0f); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); shaderBloomFinal.setDisable(); }

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2021/12/16 10:18依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。