1

OpenGLGLSLベースのシャドウマッピングを実行しようとしています。問題は、シャドウマップのレンダリングが終了した後、マップを画面にレンダリングして、レンダリングが正しく機能するかどうかをテストすることです。つまり、新しく生成されたテクスチャを、画面にマッピングするテクスチャとして使用しているだけです。 。期待される結果は、新しいテクスチャが表示されることです。しかし、代わりに、私が見ているのは、テクスチャが描かれているが非常にかすかな白い領域です。つまり、画面を特定の角度だけ傾けると、シャドウマップのかすかな輪郭が見えます。

私が何か間違ったことをしているのか誰か教えてもらえますか?

これが私のコードの関連部分です:

     void Init_FBO() 
    { 
            //glActiveTexture(GL_TEXTURE3);  
        GLfloat border[] = {1.0f, 0.0f, 0.0f, 0.0f};  

        glGenTextures(1, &depthTex);  
        glBindTexture(GL_TEXTURE_2D, depthTex);  
        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24,900,900, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);  
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);  
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);  
        glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);  
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);  
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
        glBindTexture(GL_TEXTURE_2D,0); 

        glGenFramebuffers(1, &shadowFBO);  
        glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);  
        glDrawBuffer(GL_NONE);  
        glReadBuffer(GL_NONE);  
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);  
        glBindFramebuffer(GL_FRAMEBUFFER, 0); // go back to the default framebuffer  
        // check FBO status 
        GLenum FBOstatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 
        if(FBOstatus != GL_FRAMEBUFFER_COMPLETE) 
        {
            printf("GL_FRAMEBUFFER_COMPLETE failed, CANNOT use FBO\n");
        }
        else
        {
            printf("Frame Buffer Done Succesfully\n");
        } 
    }




    void generateShadowTex()
    {
            //Calculate final ligting properties
        glm::vec4 a_f=light_ambient*mat_ambient;
        glm::vec4 d_f=light_diffuse*mat_diffuse;
        glm::vec4 s_f=light_specular*mat_specular;
        int counter=0;
        glEnable(GL_DEPTH_TEST);    // need depth test to correctly draw 3D objects 
        glClearColor(0,0,0,1); 
        //glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
        glClear(GL_DEPTH_BUFFER_BIT); 
        glCullFace(GL_FRONT);
        if(wframe)
            glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
        else
            glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 


        glUseProgram(programObject);
        //Draw the stuff using Light Position as camera 
        //glutSwapBuffers();
        glActiveTexture(GL_TEXTURE3);
        glBindTexture(GL_TEXTURE_2D,depthTex);
        glUseProgram(0);  

    }

void generateScene()
{
        //Calculate final ligting properties
    glm::vec4 a_f=light_ambient*mat_ambient;
    glm::vec4 d_f=light_diffuse*mat_diffuse;
    glm::vec4 s_f=light_specular*mat_specular;
    int counter=0;
    glEnable(GL_DEPTH_TEST);    // need depth test to correctly draw 3D objects 
    glClearColor(0,0,0,1); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    //Draw the stuff using camera as camera position

    }
    glutSwapBuffers();
    glUseProgram(0);  

}



void display() 
{
    glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO); 
    generateShadowTex(); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    generateScene(); 
}
4

1 に答える 1

1

デプステクスチャは正常に見えます。デプスカバーは、クリッププレーンの近くから遠くまでの範囲です。次を使用して、適切なクリッピングプレーンを設定できます。glFrustumf(...)

于 2012-11-20T22:09:03.477 に答える