1

我在使用 OpenGL 进行离屏渲染时遇到问题。我搜索了很多关于 FBO 和 PBO 的信息,但对我没有任何帮助。我猜这件事是由 CreateCompatibleDC 制作的 memDC 引起的。

这是我的代码的一部分

void COpenGLWnd::ShowinWnd(int ID)
{
    m_hDC = ::GetDC(m_hWnd);
    memDC = CreateCompatibleDC(m_hDC);
    SetDCPixelFormat(memDC);

    m_hRC = wglCreateContext(memDC);
    VERIFY(wglMakeCurrent(memDC, m_hRC));
    m_isitStart = 0;

    GLuint pbo;
    glGenBuffersARB(1,&pbo);
    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, (m_WndWidth * 3 + 3) / 4 * 4 * m_WndHeight, NULL, GL_STREAM_READ);

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);

    switch(ID)
    {
    case T_FADEIN:
         GLFadeinRender();
        break;
    case T_PARANORAMAL:
         GLParanormalRender();
        break;
    case T_3DCUBE:
         GL3DcubeRender();
        break;
    default:
        break;
    }

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    glReadBuffer(GL_BACK);
    glReadPixels(0,0,m_WndWidth,m_WndHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE, 0);
    BYTE* data = (BYTE*) glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
    if(data)
    {
        SaveBitmapToDirectFile(data);    //this makes bitmap file with pixel BYTE array, "data".
        glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
    }

    glBindFramebuffer(GL_PIXEL_PACK_BUFFER_ARB,0);

    SwapBuffers(memDC);

    glDeleteBuffers(1,&pbo);

    wglMakeCurrent(memDC, NULL);
    wglDeleteContext(m_hRC);
    DeleteDC(memDC);
    ::ReleaseDC(m_hWnd, m_hDC);
}

如果我在没有 memDC 和 CreateContext 的情况下在 m_hDC 上运行这个程序,那么什么都不是问题。在窗口上渲染得很好,位图文件写得很好。但我想在屏幕外渲染,只保存位图文件。我该如何处理?

4

1 回答 1

1

MemDC 会自动将您带回旧的 OpenGL-1.1 软件光栅化器。这个光栅器非常有限,不支持任何现代特性,如 FBO、PBuffers 等。

如果您想要一个 GPU 加速的 OpenGL 上下文,您需要在常规窗口(或 PBuffer DC,但要获得 PBuffer DC,您首先需要一个窗口)上创建它。您需要窗口只是为了获取上下文,您不必在那里渲染,并且窗口可以一直隐藏(省略ShowWindow创建过程的调用)。为窗口设置有效的像素格式后,在其 HDC 上创建 OpenGL 上下文。

既然你已经有一个窗口,那就去吧。

使用来自常规窗口的 OpenGL 上下文,您可以使用 FBO 进行离屏渲染。

于 2014-02-10T11:16:14.450 回答