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

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

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

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

デバッグ

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

0回答

873閲覧

謎の影響でカラーバッファが別のバッファに置き換わる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

0クリップ

投稿2021/12/21 02:10

編集2021/12/21 02:28

提示コードですがDraw_Final()関数部を実行するとブラーの掛かっていたpingpongColorbuffers[0]変数のテクスチャがブラーの掛かっていない時の画像に戻されてしまいます。またDraw_Final()をコメントアウトするとブラーの掛かった提示画像のようなものが表示されます。
デバッグの結果何かしらの原因でpingpongColorbuffers[0]変数が操作されているものと考えられるのですがこれは何が原因なのでしょうか?

現状追記

Draw_Final()関数が実行されることによってpingpongColorbuffers[1]がDraw_Final()のシェーダーによって書き換わることがわかりました。

説明

/////コメント部内部がbloom効果を発するコードです。
pingpongColorbuffers[2]配列にはブラーの掛かったフレームバッファが入る
colorBuffers[2]配列は0が普通のカラーバッファで1が輝度のカラーバッファです。

ブラー画像 pingpongColorbuffers[0]変数

イメージ説明

カラーバッファ colorbuffers[0]変数

イメージ説明

描画ループ部
// ##################################### 描画 ##################################### void FrameWork::Camera::Renderer() { glEnable(GL_CULL_FACE); //カリングを有効 glCullFace(GL_BACK); //裏面を無効 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// sprite->Draw(getViewProjection(), glm::vec3(0, 0, -200), 0, 0.0f, glm::vec2(1.0, 1.0), glm::vec2(0, 0), glm::vec2(100, 100)); //カラーバッファ sprite->Draw_Luminance(colorBuffers[0], glm::vec3(0, 0, -200), 0, 0.0f, glm::vec2(1.0, 1.0), glm::vec2(0, 0), glm::vec2(100, 100)); //輝度バッファ sprite->Draw_setBlur(quadVertices,quadVAO, quadVBO,colorBuffers[1],pingpongColorbuffers,pingpongFBO); //ブラー sprite->Draw_Final(colorBuffers[0], pingpongColorbuffers); //カラーバッファに書き込み /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// glDisable(GL_DEPTH_TEST); glBindFramebuffer(GL_FRAMEBUFFER, 0); //フレームバッファ描画 glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); shader.setEnable(); shader.setUniform1i("hdr", 1); //glBindTexture(GL_TEXTURE_2D, textureColorbuffer); //glBindTexture(GL_TEXTURE_2D, colorBuffers[1]); // glBindTexture(GL_TEXTURE_2D, colorBuffers[0]); glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[0]); // glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[1]); glActiveTexture(GL_TEXTURE0); glDrawArrays(GL_TRIANGLES, 0, 6); shader.setDisable(); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); actor.clear(); shadowActor.clear(); }
Bloom実装部

CPP

1 2 3// ##################################### テクスチャ描画 ##################################### 4void FrameWork::D2::Sprite::Draw(glm::mat4 projection,glm::vec3 position, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end) 5{ 6 7 shaderTexture.setEnable(); 8 glBindVertexArray(vao); 9 glBindBuffer(GL_ARRAY_BUFFER, vbo); 10 11 startSize = start; //テクスチャ始点 12 endSize = end; //テクスチャ終点 13 14 vertex->resize(6); 15 setAttribute(); //頂点属性 設定 16 17 setNormal(); //法線 設定 18 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex->size(), vertex->data()); 19 20 //Transform 21 glm::vec3 pos = position; 22 pos.y = (float)FrameWork::windowContext->getSize().y - pos.y - (glm::vec2(end - start).y / 2); 23 pos.x = pos.x + (glm::vec2(end - start).x / 2); 24 //setPosition(pos); //座標 25 26 27 setPosition(position); 28 29 //setScale(s + glm::vec2(end - start)); //スケール 30 setScale(glm::vec2(100,100)); //スケール 31 setRotate(PI / 4); //回転 32 33 //描画 34 35 shaderTexture.setUniform3f("uLightPosition", glm::vec3(0, 0, -199)); 36 //shaderTexture.setUniform3f("uLightPosition", glm::vec3(0, 0, 10)); 37 38 shaderTexture.setUniform3f("uLightColor", glm::vec3(1, 1, 1)); 39 shaderTexture.setUniform3f("uObjectColor", glm::vec3(1, 0, 0)); 40 shaderTexture.setUniform3f("uViewPosition", glm::vec3(0, 0, 10)); 41 shaderTexture.setUniform1f("uAmbientStrength",1.0f); 42 shaderTexture.setUniform1f("uSpecularStrength",0.5); 43 shaderTexture.setUniform1f("uShininessStrength",256.0); 44 45 shaderTexture.setUniformMatrix4fv("uTranslate",getMatTranslation()); 46 shaderTexture.setUniformMatrix4fv("uRotate", getMatRotate()); 47 shaderTexture.setUniformMatrix4fv("uScale", getMatScale()); 48 shaderTexture.setUniformMatrix4fv("uViewProjection", projection); 49 //shaderTexture.setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, (float)FrameWork::windowContext->getSize().x, 0.0f, (float)FrameWork::windowContext->getSize().y)); 50 //printf("%d\n",textureID.at(texNum)); 51 52 //glActiveTexture(GL_TEXTURE0); //テクスチャ有効 53 //glBindTexture(GL_TEXTURE_2D, textureID.at(texNum)); //テクスチャバインド 54 55 56 57 glDrawArrays(GL_TRIANGLES, 0, vertex->size()); //描画 58 59 //バインド解除 60 glBindVertexArray(0); 61 glBindBuffer(GL_ARRAY_BUFFER, 0); 62 //glBindTexture(GL_TEXTURE_2D, 0); 63 64 shaderTexture.setDisable(); 65} 66 67// ##################################### 輝度描画 ##################################### 68void FrameWork::D2::Sprite::Draw_Luminance(GLuint texture, glm::vec3 position, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end) 69{ 70 71 shaderLuminance.setEnable(); 72 glBindVertexArray(vao); 73 glBindBuffer(GL_ARRAY_BUFFER, vbo); 74 75 startSize = start; //テクスチャ始点 76 endSize = end; //テクスチャ終点 77 78 vertex->resize(6); 79 setAttribute(); //頂点属性 設定 80 setNormal(); //法線 設定 81 82 83 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * vertex->size(), vertex->data()); 84 85 //Transform 86 glm::vec3 pos = position; 87 pos.y = (float)FrameWork::windowContext->getSize().y - pos.y - (glm::vec2(end - start).y / 2); 88 pos.x = pos.x + (glm::vec2(end - start).x / 2); 89 //setPosition(pos); //座標 90 91 92 setPosition(position); 93 94 setScale(s + glm::vec2(end - start)); //スケール 95 //setScale(glm::vec2(100,100)); //スケール 96 setRotate(r); //回転 97 98 glActiveTexture(GL_TEXTURE0); //テクスチャ有効 99 glBindTexture(GL_TEXTURE_2D, texture); //テクスチャバインド 100 101 102 103 glDrawArrays(GL_TRIANGLES, 0, vertex->size()); //描画 104 105 //バインド解除 106 glBindVertexArray(0); 107 glBindBuffer(GL_ARRAY_BUFFER, 0); 108 glBindTexture(GL_TEXTURE_2D, 0); 109 110 shaderLuminance.setDisable(); 111} 112 113// ##################################### bloom ブラー 描画 ##################################### 114void FrameWork::D2::Sprite::Draw_setBlur(float vert[24], const GLuint quadVAO, const GLuint quadVBO, const GLint frameBuffer_Luminance, GLuint pingpongColorbuffers[2], GLuint pingpongFBO[2]) 115{ 116 horizontal = 0; 117 bool first_iteration = true; 118 unsigned int amount = 10; 119 setAttribute(); //頂点属性 設定 120 121 122 glBindVertexArray(vao2); 123 glBindBuffer(GL_ARRAY_BUFFER, vbo2); 124 125 126 horizontal = 0; 127 glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[0]); 128 shaderBloomBlur.setEnable(); 129 glBindTexture(GL_TEXTURE_2D, frameBuffer_Luminance); 130 glActiveTexture(GL_TEXTURE0); 131 shaderBloomBlur.setUniform1i("horizontal", 0); 132 glDrawArrays(GL_TRIANGLES, 0, 6); //描画 133 glBindTexture(GL_TEXTURE_2D, 0); 134 shaderBloomBlur.setDisable(); 135 136 horizontal = 1; 137 for (int i = 0; i < amount; i++) 138 { 139 //printf("%d\n",horizontal); 140 shaderBloomBlur.setEnable(); 141 glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[horizontal]); 142 143 if (horizontal == 1) 144 { 145 glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[0]); 146 } 147 else 148 { 149 glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[1]); 150 151 } 152 153 glActiveTexture(GL_TEXTURE0); 154 shaderBloomBlur.setUniform1i("horizontal", horizontal); 155 glDrawArrays(GL_TRIANGLES, 0, 6); //描画 156 shaderBloomBlur.setDisable(); 157 glBindTexture(GL_TEXTURE_2D, 0); 158 159 if (horizontal == 1) 160 { 161 horizontal = 0; 162 } 163 else 164 { 165 horizontal = 1; 166 167 168 } 169 } 170 171 //バインド解除 172 glBindVertexArray(0); 173 glBindBuffer(GL_ARRAY_BUFFER, 0); 174 glBindTexture(GL_TEXTURE_2D, 0); 175 glBindFramebuffer(GL_FRAMEBUFFER, 0); 176} 177 178 179// ##################################### ブラーをカラーバッファに書き込み ##################################### 180void FrameWork::D2::Sprite::Draw_Final(GLuint frameBuffer, GLuint pingpongColorbuffers[2]) 181{ 182 shaderBloomFinal.setEnable(); 183 glBindVertexArray(vao2); 184 glBindBuffer(GL_ARRAY_BUFFER, vbo2); 185 186 glActiveTexture(GL_TEXTURE0); 187 glBindTexture(GL_TEXTURE_2D, frameBuffer); 188 189 glActiveTexture(GL_TEXTURE1); 190 glBindTexture(GL_TEXTURE_2D, pingpongColorbuffers[horizontal]); 191 192 shaderBloomFinal.setUniform1i("bloom", 1); 193 shaderBloomFinal.setUniform1f("exposure", 2.0f); 194 195 glDrawArrays(GL_TRIANGLES, 0, 6); 196 197 glBindVertexArray(0); 198 glBindBuffer(GL_ARRAY_BUFFER, 0); 199 200 shaderBloomFinal.setDisable(); 201 202} 203 204
Draw_Final()シェーダー部

glsl

1/*######################################################################### 2# バーティックスシェーダー 3###########################################################################*/ 4 5layout (location = 0) in vec2 vertexPosition; 6layout (location = 1) in vec2 vertexUV; 7 8out vec2 TexCoords; 9 10void main() 11{ 12 TexCoords = vertexUV; 13 gl_Position = vec4(vertexPosition,-1.0, 1.0); 14}

glsl

1/*######################################################################### 2# フラグメントシェーダー 3###########################################################################*/ 4 5out vec4 FragColor; 6//layout(location = 0) out vec4 FragColor; 7 8in vec2 TexCoords; 9 10uniform sampler2D scene; 11uniform sampler2D bloomBlur; 12uniform int bloom; 13uniform float exposure; 14 15void main() 16{ 17 const float gamma = 2.2; 18 vec3 hdrColor = texture(scene, TexCoords).rgb; 19 vec3 bloomColor = texture(bloomBlur, TexCoords).rgb; 20 if(bloom == 1) 21 { 22 hdrColor += bloomColor; // additive blending 23 } 24 25 // tone mapping 26 vec3 result = vec3(1.0) - exp(-hdrColor * exposure); 27 // also gamma correct while we're at it 28 29 result = pow(result, vec3(1.0 / gamma)); 30 FragColor = vec4(result, 1.0); 31// FragColor = vec4(hdrColor, 1.0); 32 33}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問