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

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

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

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

デバッグ

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

C++

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

Q&A

0回答

1471閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

C++

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

0グッド

0クリップ

投稿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(); }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問