85224


提示コードですがbloom効果の実装で輝度を抽出したカラーバッファを使って画像を`ぼかし`たいのですが参考サイト通り実装したのですが`pingpongColorbuffers[2]`を途中ですが表示させたのですが何も表示されません。また`///`コメント部内部のコードをコメントアウトするとブラーの掛かったスプライトが描画されます。なぜ`///`コメント部のコードをコメントアウトすると表示されるのでしょうか？原因がわかりません。

##### 知りたい事

なぜコメント部のコードをコメントアウトするとブラーの掛かったスプライトが描画されてコメントアウトしないで描画すると何も描画されないのか知りたい。描画バッファーは`pingpongColorbuffers[0]`で`pingpongColorbuffers[1]`は真っ白になります。

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

##### 試したこと、確認したこと

１，フラグメントシェーダー部の最下部のコードのようにデバッグした結果。カラーバッファにはレンダリングされていることを確認しました。  
２，輝度をカラーバッファにレンダリングしてあるかどうかを確認(提示画像)

##### 輝度を抽出

[![画像の説明をここに入力](https://i.stack.imgur.com/Gg1fz.png)](https://i.stack.imgur.com/Gg1fz.png)

##### Bloom_blur

[code]

    // ##################################### bloom ブラー　描画 #####################################
    void FrameWork::D2::Sprite::Draw_setBlur(float vert[24],const GLuint quadVAO, const GLuint quadVBO,const GLint frameBuffer_Luminance, GLuint pingpongColorbuffers[2], GLuint pingpongFBO[2])
    {
        horizontal = 0;
        bool first_iteration = true;
        unsigned int amount = 10;
        setAttribute();  //頂点属性　設定
    
    
        glBindVertexArray(vao2);
        glBindBuffer(GL_ARRAY_BUFFER, vbo2);
    
    
        horizontal = 0;
        glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[0]);  
        shaderBloomBlur.setEnable();
        glBindTexture(GL_TEXTURE_2D, frameBuffer_Luminance);
        glActiveTexture(GL_TEXTURE0);
        shaderBloomBlur.setUniform1i("horizontal",0);
        glDrawArrays(GL_TRIANGLES, 0, 6); //描画
        shaderBloomBlur.setDisable();
    
        horizontal = 1;
        glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[1]);
        shaderBloomBlur.setEnable();
        glBindTexture(GL_TEXTURE_2D, pingpongFBO[0]);
        glActiveTexture(GL_TEXTURE0);
        shaderBloomBlur.setUniform1i("horizontal", 1);
        glDrawArrays(GL_TRIANGLES, 0, 6); //描画
        shaderBloomBlur.setDisable();
    ///////////////////////////////////////////////////////////////////
        
        horizontal = 0;
        glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[0]);
        shaderBloomBlur.setEnable();
        glBindTexture(GL_TEXTURE_2D, pingpongFBO[1]);
        glActiveTexture(GL_TEXTURE0);
        shaderBloomBlur.setUniform1i("horizontal", 0);
        glDrawArrays(GL_TRIANGLES, 0, 6); //描画
        shaderBloomBlur.setDisable();
    
        
    ///////////////////////////////////////////////////////////////////
        //バインド解除
        glBindVertexArray(0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindTexture(GL_TEXTURE_2D, 0);
    
    }
    
    
[/code]

##### GLSL

[code]

    /*#########################################################################
    # バーティックスシェーダー 
    ###########################################################################*/
    
    
    
    layout (location = 0) in vec2 vertexPosition;
    layout (location = 1) in vec2 vertexUV;
    
    layout (location = 2) out vec2 TexCoords;
    
    void main()
    {
        TexCoords = vertexUV;
        gl_Position = vec4(vertexPosition.x,vertexPosition.y,0.0,1.0);
    }
    
[/code]

[code]

    /*#########################################################################
    #　フラグメントシェーダー 
    ###########################################################################*/
    
    
    
    out vec4 FragColor;
    
    layout (location = 2) in vec2  TexCoords;
    
    uniform sampler2D image;
    
    uniform int horizontal;
    uniform float weight[5] = float[] (0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162);
    //float weight[5] = float[] (1.0, 1.0, 1.0, 1.0, 1.0);
    
    void main()
    {
        vec2 tex_offset = 1.0 / textureSize(image, 0); // gets size of single texel
        vec3 result = texture(image, TexCoords).rgb * weight[0];
        //vec3 result = texture(image, TexCoords).rgb;
        
        if(horizontal == 1)
        {
            for(int i = 1; i < 5; ++i)
            {
                result += texture(image, TexCoords + vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
                result += texture(image, TexCoords - vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
            }
        }
        else
        {
            for(int i = 1; i < 5; ++i)
            {
                result += texture(image, TexCoords + vec2(0.0, tex_offset.y * i)).rgb * weight[i];
                result += texture(image, TexCoords - vec2(0.0, tex_offset.y * i)).rgb * weight[i];
            }
        }
        
    
    
        FragColor = vec4(result, 1.0);
    //    FragColor = vec4(texture(image, TexCoords).rgb,1.0);
        //FragColor = vec4(0.0,1.0,0.0, 1.0);
    
    
    }
    
[/code]


CC BY-SA 4.0
2021-12-19T04:38:36.183
85221
2021-12-19T06:34:46.047
2021-12-19T06:04:14.997
question
c++ opengl
GLSLでbloom効果のぼかしを実装するとカラーバッファが空になってしまう原因が知りたい。


提示コードですがフレームバッファの設定中に別のコードである`ぼかしフレームバッファ`のコートが記述されていることが原因でした。提示コードの`//`ここに記述部参照  
よってコメント部`///`で内部の場所にコードを移動させることによって解決しました。

原因: カスタムフレームバッファの実装中に別の作業であるカラーバッファの実装をしてしまっていた。

[code]

    // ##################################### 初期化　##################################### 
    FrameWork::Camera::Camera()
    {
        actor.resize(0);
        shadowActor.resize(0);
        vertex->resize(6);  //頂点配列を初期化 2Dスプライト描画用
    
        //フレームバッファ
        glGenFramebuffers(1, &framebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    
    
    
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    
        glGenFramebuffers(1, &hdrFBO);
        glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO);
        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);
            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
            );
        }
    
        unsigned int attachments[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
        glDrawBuffers(2, attachments);
    
    
        /*
        * //////////////ここに記述
        * 
        * 
        */
    
    
    
    
        /*
        //フレームバッファのテクスチャ
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);    //アタッチメント
    
        */
    
        //深度バッファとステンシルバッファ
        glGenRenderbuffers(1, &rbo);
        glBindRenderbuffer(GL_RENDERBUFFER, rbo);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y);  //深度バッファとステンシルバッファの作成
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);   //深度バッファとステンシルバッファを設定
        glBindRenderbuffer(GL_RENDERBUFFER, 0);
        
    
        /*
        //カラーバッファ
        glGenTextures(1, &textureColorbuffer);
        glBindTexture(GL_TEXTURE_2D, textureColorbuffer);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glBindTexture(GL_TEXTURE_2D, 0);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); //カラーバッファをアタッチ
        */
        
        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        {
            std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl;
        }
    
    
    
        //深度マップ
        glGenFramebuffers(1, &depthMapFBO);
        glGenTextures(1, &depthMap);
        glBindTexture(GL_TEXTURE_2D, depthMap);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);
        glDrawBuffer(GL_NONE);
        glReadBuffer(GL_NONE);
    
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    
    ///////////////////////////////////////////////////////////////////////
        //ぼかしカラーバッファー   
        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;
            }
        }
    /////////////////////////////////////////////////////////////////////////
        //レンダリングポリゴン
        glGenVertexArrays(1, &quadVAO);
        glGenBuffers(1, &quadVBO);
    
        //shader.Load("shader/FrameBuffer_depth.vert", "shader/FrameBuffer_depth.frag");    //深度バッファを描画
        shader.Load("shader/FrameBuffer.vert", "shader/FrameBuffer.frag");  
    
        shader.setEnable();
        glBindVertexArray(quadVAO);
        glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
        
        glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float), &quadVertices, GL_STATIC_DRAW);
    
        GLuint attrib = shader.getAttribLocation("vertexPosition"); 
        glEnableVertexAttribArray(attrib);
        glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
        shader.setBindAttribLocation("vertexPosition");
    
    
    
        attrib = shader.getAttribLocation("vertexUV");
        glEnableVertexAttribArray(attrib);
        glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
        shader.setBindAttribLocation("vertexUV");
    
        shader.setDisable();
        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER,0);
    
    
        
    
    
        scale = glm::mat4();        //拡大縮小
        rotate = glm::mat4();       //回転
        translate = glm::mat4();    //平行移動
    
        //描画行列
        float aspect = (float)FrameWork::windowContext->getSize().x / (float)FrameWork::windowContext->getSize().y;
    
        position = glm::vec3(0,0,10);   //座標
        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), aspect, 0.1f, 10000.0f);                     //透視射形行列
    
    
        sprite = std::make_shared<FrameWork::D2::Sprite>(quadVertices);
    
        sprite->InputTexture(FrameWork::LoadTexture("texture/texture_3.png"));
    
    
    
    }
    
    
[/code]


CC BY-SA 4.0
2021-12-19T06:34:46.047
85224
2021-12-19T06:34:46.047
85221
answer