来自FBO的Opengl纹理(有没有mimap)

时间:2012-03-13 17:27:34

标签: opengl fbo glreadpixels texturing

我必须在使用FBO时遗漏一些明显的东西:

我在应用程序开始时调用了一次TMyForm :: Init():

class TMyForm
{ ...
    private:
    Gluint mTextureId, mFboId;
    int mWidth, mHeight;
}

void TMyForm::Init()
{
    mWidth = 1920;
    mHeight = 1080;
    ...
    // create a texture object
    glEnable(GL_TEXTURE_2D);
    glClearColor ( 0.0, 0.0, 0.0, 1.0 );

    glGenTextures(1, &mTextureId);
    glBindTexture(GL_TEXTURE_2D, mTextureId);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

    // create a framebuffer object
    glGenFramebuffersEXT(1, &mFboId);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFboId);

    // attach the texture to FBO color attachment point
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,    mTextureId, 0);

    // switch back to window-system-provided framebuffer
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

在Draw()函数中,我将缓冲区发送到卡片(渲染的场景正常)和预览窗口(全黑或全白,具体取决于我是否切换回默认窗口上下文或fbo上下文):

void TMyForm::Draw()
{
    // set rendering destination to FBO
    glEnable(GL_TEXTURE_2D);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFboId);

    //---
    glViewport(-1920, -1080, 1920 * 2, 1080 * 2);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(double(-iWidth)*viewport_ratio, double(iWidth)*viewport_ratio, double(-iHeight), double(iHeight), 1000.0, 100000.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    

    Render();

    glFlush();

    //--- 1 : send to card
    delete[] mBufferPlayout;
    mBufferPlayout = NULL;
    try
    {
        mBufferPlayout = new GLubyte [mWidth * mHeight * 4];

        glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
        glReadPixels(0,0, mWidth, mHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, mBufferPlayout);

        DisplayFrame(mBufferPlayout);
    }
    catch (TSCDbException &e)    {        ShowMessage(GetLastError());    }

    //--- 2 : Texturing to the preview window :
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, mTextureId);
    //glGenerateMipmapEXT(GL_TEXTURE_2D);

    int iWidthPreview = mWidth / 2; // ie 960
    int iHeightPreview = mHeight / 2; // ie 540
    glViewport(-iWidthPreview, -iHeightPreview, iWidthPreview * 2, iHeightPreview * 2);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(double(-iWidthPreview), double(iWidthPreview), double(-iHeightPreview), double(iHeightPreview), 1000.0, 100000.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -50000.0);
        mxIncrust0 = 0.0;       myIncrust0 = 0.0;
        mxIncrust1 = iWidthPreview;    myIncrust1 = iHeightPreview;
        glBegin(GL_QUADS);
            glColor4ub(255,255,255,255);
            glTexCoord2d(0.0, 0.0); glVertex2d(mxIncrust0, myIncrust0);
            glTexCoord2d(0.0, 1.0); glVertex2d(mxIncrust0, myIncrust1);
            glTexCoord2d(1.0,1.0);  glVertex2d(mxIncrust1, myIncrust1);
            glTexCoord2d(1.0,0.0);  glVertex2d(mxIncrust1, myIncrust0);
        glEnd();
    glDisable(GL_TEXTURE_2D);
    glFlush();
    //---
    SwapBuffers(ghDC);
}

所以我的问题是“第2部分”没有做我想做的事:将fbo内容纹理化到当前窗口。 我尝试更改“glTexCoord2d”但没有成功。

0 个答案:

没有答案