如何在屏幕外渲染?

时间:2014-02-10 08:34:19

标签: windows opengl off-screen

我在使用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);
}

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

1 个答案:

答案 0 :(得分:1)

MemDC将自动退回旧的OpenGL-1.1软件光栅化器。这种光栅化器非常有限,不支持任何类型的现代功能,如FBO,PBuffers等。

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

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

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