84083


コードはシャドウマップを用いた影を描画するコードです。提示画像ようにカメラを動かすと緑の立方体が消えたり映ったりしますどうやら二つのオブジェクトがあると何かしらの影響でどちらかが謎の影響を受けているのようなのですが原因がわかりません。

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

全ソースコード: <https://www.dropbox.com/s/0ke94gp7y6mpybh/source.zip?dl=0>

##### 利用ライブラリ

stb  
opengl  
freetype  
glm  
glfw  
glew  
assimp

TopViewGameFrameWorkのCamera.Render部  
TopViewGameのGrond.cpp,Cube.cpp部

##### 現状、調べたこと

・//void
ShadowRenderer()関数のmodel->Renderer(view)関数をコメントアウトすると正常に描画されます。下記ソースコード参照  
・影を地面のオブジェクトに描画するというコードです。  
・また影は何かしらの原因で描画されません。  
・カリングを設定して背面を無効にして深度バッファを有効です  
・どうやらデプスバッファ、カリングは上手く動作していて何かが影響を受けているせいか二つのオブジェクトを描画すると片方がちらつきます。

##### 知りたいこと

カメラを動かすと緑色の立方体が消えたり映ったりする原因として考えられるものは何か知りたい。

※提示コードは描画ループです。

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

##### 描画メインループ

[code]

    void FrameWork::Camera::Renderer()
    {
    
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glEnable(GL_TEXTURE_2D);                            //テクスチャを有効
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  //ブレンドタイプ
        glEnable(GL_BLEND);                                 //ブレンド有効
        glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);              //半透明
        glEnable(GL_DEPTH_TEST);                            //深度バッファを有効
        glDepthFunc(GL_LEQUAL);                             //深度バッファタイプ
    
        glEnable(GL_CULL_FACE);                             //カリングを有効
        glCullFace(GL_BACK);                                //裏面を無効
    
        glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
        glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
        glClear(GL_DEPTH_BUFFER_BIT);
    
        //シャドウオブジェクト
        for(std::vector<std::shared_ptr<Actor>>::iterator itr = actor.begin(); itr != actor.end(); itr++)
        {   
            (*itr)->RendererDepth(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);
        
        //オブジェクト
        for(std::vector<std::shared_ptr<Actor>>::iterator itr = actor.begin(); itr != actor.end(); itr++)
        {   
            (*itr)->Renderer(getViewProjection());
        }
    
    
    
        //シャドウオブジェクト
        for(std::vector<std::shared_ptr<Actor>>::iterator itr = actor.begin(); itr != actor.end(); itr++)
        {   
            (*itr)->RendererShadow(depthMap,getViewProjection());
        }
    
    
        glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, intermediateFBO);
        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);
        shaderFrameBuffer->setEnable();
        glBindVertexArray(quadVAO);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, screenTexture);
        glDrawArrays(GL_TRIANGLES, 0, 6);
        shaderFrameBuffer->setDisable();
    
    
        glBindVertexArray(0);
        glBindTexture(GL_TEXTURE_2D,0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    
    
        actor.clear();
        shadowActor.clear();
    
    }
    
    
[/code]

##### RendererShadow

[code]

    void Ground::RendererShadow(GLuint depth,glm::mat4 view)const
    {
        model->setBindBuffer();
        model->shader.setEnable();
    
        model->shader.setUniformMatrix4fv("lightSpaceMatrix",lightSpaceMatrix);      
        model->shader.setUniform3f("viewPos",viewPos);
        model->shader.setUniform3f("lightPos",lightPos);
        model->shader.setUniformMatrix4fv("uViewProjection", view);
    
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texture);
    
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, depth);
    
    
        model->setScale(glm::vec3(100,1,100));
        model->setRotate(glm::vec3(1,1,1),0);
    
    
    
    
    
    
        model->Renderer(view);
    
        model->shader.setDisable();
        model->setUnBindBuffer();      
    }
    
    
[/code]

#####立方体

[code]

    void Cube::RendererDepth(glm::mat4 view)const
    {      
          model->shader = shader;
          model->shader.setEnable();
          model->setBindBuffer();      
    
    
    
    
          model->setPosition(position);
          model->setScale(glm::vec3(5,5,5));
          model->setRotate(glm::vec3(1,0,0),0);
    
    
    
    
    
          model->shader.setUniformMatrix4fv("lightSpaceMatrix",lightSpaceMatrix);
    
    
    
    
    
    
          //model->Renderer(view);
    
    
    
          model->shader.setDisable();
          model->setUnBindBuffer();      
    
    
    }
    
    
    
    
    void Cube::Renderer(glm::mat4 view)const
    {
        model->shader = debugShader;
        model->setBindBuffer();
        model->shader.setEnable();
    
    
        model->shader.setUniform4f("uFragment", FrameWork::GetGlColor(glm::vec4(0, 255, 0, 255)));
        model->shader.setUniformMatrix4fv("uViewProjection",view);
    
    
        model->Renderer(view);
        model->shader.setDisable();
        model->setUnBindBuffer();      
    }
    
    
[/code]

##### void Renderer()関数

[code]

    void FrameWork::D3::Object::Renderer(glm::mat4 view)
    {
          
          //描画
          shader.setUniformMatrix4fv("uTranslate", getMatTranslation());
          shader.setUniformMatrix4fv("uRotate", getMatRotate());
          shader.setUniformMatrix4fv("uScale", getMatScale());
         // shader.setUniformMatrix4fv("uViewProjection", view);
    
          if (obj->index.size() > 0)
          {
                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);
                 glDrawElements(GL_TRIANGLES, obj->index.size(), GL_UNSIGNED_INT,(void*)0); //描画
                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
          }
          else
          {
                glDrawArrays(GL_TRIANGLES, 0, obj->attribute.size()); //描画
          }
    
    }
    
[/code]


CC BY-SA 4.0
2021-12-07T07:01:50.217
84001
2021-12-12T11:04:53.657
2021-12-12T09:50:55.533
question
c++ opengl
「OpenGL」デプスバッファを使った描画を行うと他の描画物がちらつく原因が知りたい。


透視射形行列が以下のうになっていることが原因でした。`0.00001f,`というすごく０に近い値を代入しているためでした。

[code]

    projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.00001f, 10000.0f);            //透視射形行列
    
[/code]

以下のよに値を１に近い値に修正したところ治りました。

[code]

    projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 10000.0f);            //透視射形行列
    
[/code]

参考サイト: <https://stackoverflow.com/questions/43954385/opengl-screen-is-
flickering-when-enabling-depth-test>


CC BY-SA 4.0
2021-12-12T11:04:53.657
84083
2021-12-12T11:04:53.657
84001
answer