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

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

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

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

デバッグ

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

C++

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

受付中

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

C++

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

0回答

-2評価

0クリップ

776閲覧

投稿2021/12/15 12:07

編集2022/01/12 10:55

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

描画手順

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

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

描画ループ

cpp

// ##################################### 初期化 ##################################### FrameWork::Camera::Camera() { //カラーバッファ glGenFramebuffers(1, &hdrFBO); glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO); // create 2 floating point color buffers (1 for normal rendering, other for brightness threshold values) glGenTextures(2, colorBuffers); for (unsigned int i = 0; i < 2; i++) { glBindTexture(GL_TEXTURE_2D, colorBuffers[i]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 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! glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // attach texture to framebuffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, colorBuffers[i], 0); } //描画行列 position = glm::vec3(0,0,1); //座標 vecLook = glm::vec3(0,0,-1); //向き(視線) view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); //ビュー行列 projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 10000.0f); //透視射形行列 sprite.InputTexture(FrameWork::LoadTexture("texture/texture_3.png")); glGenFramebuffers(2, pingpongFBO); glGenTextures(2, pingpongColorbuffers); for (unsigned int i = 0; i < 2; i++) { glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[i]); glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[i]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 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! glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pingpongColorbuffers[i], 0); // also check if framebuffers are complete (no need for depth buffer) if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer not complete!" << std::endl; } } void FrameWork::Camera::Renderer() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); //深度バッファを有効 glDepthFunc(GL_LEQUAL); //深度バッファタイプ glEnable(GL_CULL_FACE); //カリングを有効 glCullFace(GL_BACK); //裏面を無効 glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); glClear(GL_DEPTH_BUFFER_BIT); //深度バッファレンダリング for(std::vector<std::shared_ptr<Actor>>::iterator itr = actor.begin(); itr != actor.end(); itr++) { (*itr)->Renderer_DepthOnly(getViewProjection()); } glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0, 0, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO); // 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)); 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)); 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)); glBindFramebuffer(GL_FRAMEBUFFER, 0); sprite.Draw_setBlur(quadVAO,quadVBO, colorBuffers[1],pingpongColorbuffers,pingpongFBO); //ImGui ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glBindFramebuffer(GL_READ_FRAMEBUFFER, colorBuffers[0]); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, hdrFBO); 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); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glDisable(GL_DEPTH_TEST); sprite.Draw_Final(colorBuffers[0], pingpongColorbuffers); shaderFrameBuffer->setEnable(); glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, colorBuffers[0]); glDrawArrays(GL_TRIANGLES, 0, 6); shaderFrameBuffer->setDisable(); glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D,0); glBindFramebuffer(GL_FRAMEBUFFER, 0); actor.clear(); shadowActor.clear(); }
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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenGL

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

デバッグ

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

C++

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