1

可爱的深度纹理

这是我在尝试实现阴影贴图时不断看到 gDebugger 的可爱图像。作为参考,我正在使用http://fabiensanglard.net/shadowmapping/index.php上的教程。我尝试了几种不同的结果,结果各不相同,主要是具有平坦深度值的 FBO(没有表示奇怪深度范围的轻微变化)或这个很棒的家伙。我已经尝试了很多不同的东西,但是唉,没有完全的 FBO 失败,我主要是回到这个问题上。作为参考,这里是 gDebugger 作为我的实际深度缓冲区吐出的内容:

深度

因此,考虑到所有这些,这是我的代码。着色器代码被保留,因为我还没有在我的 FBO 中得到值得处理的东西。

这是我初始化 FBO/Depth tex 的方法:

    int shadow_width = 1024;
    int shadow_height = 1024;

    // Try to use a texture depth component
    glGenTextures(1, &depth_tex);
    glBindTexture(GL_TEXTURE_2D, depth_tex);

    // GL_LINEAR does not make sense for depth texture. However, next tutorial shows usage of GL_LINEAR and PCF
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    // Remove artefact on the edges of the shadowmap
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

    // No need to force GL_DEPTH_COMPONENT24, drivers usually give you the max precision if available 
    glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 
        shadow_width, shadow_height, 0, GL_DEPTH_COMPONENT, 
        GL_FLOAT, 0);
    // attach the texture to FBO depth attachment point 
    glBindTexture(GL_TEXTURE_2D, 0);

    // create a framebuffer object
    glGenFramebuffers(1, &fbo_id);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);

    // Instruct openGL that we won't bind a color texture with the currently binded FBO
    glDrawBuffer(GL_NONE);
    glReadBuffer(GL_NONE);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D, depth_tex, 0);

    // switch back to window-system-provided framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

这是我的渲染代码:

    glLoadIdentity();
    float lpos[4] = {0,0,0,1};
    float lpos3[4] = {5000,-500,5000,1};

    glBindTexture(GL_TEXTURE_2D,0);
    glBindFramebuffer(GL_FRAMEBUFFER,fbo_id);
    glViewport(0, 0, 1024, 1024);
    glClear(GL_DEPTH_BUFFER_BIT);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    setup_mats(lpos[0],lpos[1],lpos[2],lpos3[0],lpos3[1],lpos3[2]);

    glCullFace(GL_FRONT);
    mdlman.render_models(R_STENCIL);
    mdlman.render_model(R_STENCIL,1);
    set_tex_mat();
    glBindFramebuffer(GL_FRAMEBUFFER,0);

    glViewport( 0, 0, (GLsizei)800, (GLsizei)600 );
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    this->r_cam->return_LookAt();
    gluPerspective(45,800/600,0.5f,2000.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(&r_cam->getProjectionMatrix()[0][0]);
    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(&r_cam->getViewMatrix()[0][0]);

    glCullFace(GL_BACK);
    mdlman.render_models(R_NORM);

以下是我为 FBO 绘制对象的方式:

        glEnableClientState(GL_NORMAL_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);
        glBindBuffer(GL_ARRAY_BUFFER,models.at(mdlid).t_buff);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,models.at(mdlid).i_buff);

        glNormalPointer(GL_FLOAT,sizeof(vert),BUFFER_OFFSET(sizeof(GLfloat)*2));
        glVertexPointer(3, GL_FLOAT,sizeof(vert),BUFFER_OFFSET(sizeof(GLfloat)*5));         

        glDrawElements(GL_TRIANGLES,(models.at(mdlid).f_index.size())*3,GL_UNSIGNED_INT,0);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_NORMAL_ARRAY);

一些结束语:来自 gDebugger 的深度缓冲区图像是来自灯光 POV。我的相机是基于四元数的,并使用与 OGL 对齐的矩阵作为它的 lookAt 函数(用于转换为灯光位置/视图)。如果需要,我可以提供代码。其他所有内容几乎都是从教程中复制的,以确保我没有做或设置一些愚蠢的东西。

4

0 回答 0