1

素敵な深みのあるテクスチャ

これは、シャドウマップを実装しようとしているときにgDebuggerを見続ける素敵な画像です。参考までに、http://fabiensanglard.net/shadowmapping/index.phpのチュートリアルを使用しています。私はさまざまな結果でいくつかの異なることを試しましたが、ほとんどはフラットな深度値を持つFBO(奇妙な深度範囲を示すわずかな変動はありません)またはこの素晴らしい人です。私はさまざまなことを試しましたが、残念ながら、FBOが完全に失敗することはありません。ほとんどの場合、これに戻ります。参考までに、gDebuggerが実際の深度バッファーとして吐き出すものは次のとおりです。

深さ

それで、これらすべてを念頭に置いて、ここに私のコードがあります。処理する価値のあるものをFBOにまだ取得していないため、シェーダーコードは保留されています。

FBO /Depthtexを初期化する方法は次のとおりです。

    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からのものです。私のカメラはクォータニオンベースであり、lookAt関数(ライトの位置/ビューに変換するために使用されます)にOGLで整列されたマトリックスを使用します。必要に応じてそのコードを提供できます。他のすべては、私が愚かなことをしている、または設定していないことを確認するために、チュートリアルからほとんどカーボンコピーされています。

4

0 に答える 0