2014-02-10 143 views
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); 
} 

一部分。如果我运行这个PROGRAMM没有memDC和上的createContext m_hDC,什么也没有问题。在窗口上进行渲染,写得很好的位图文件。但我想在屏幕外渲染,只保存位图文件。我该如何处理?

+0

感谢您的回答!但我怎么才能使用SelectObject呢?你能再次推荐我吗? – phraust

+0

我在初始化步骤中插入了新代码,如__m_hMemBmp = :: CreateCompatibleBitmap(m_hDC,m_WndWidth,m_WndHeight); :: SelectObject(memDC,m_hMemBmp); __ 但仍然没有任何变化 – phraust

+0

我使用Borland,在它下面,我从来没有得到位图渲染运行。所以如果你的问题持续存在,你可以在没有任何额外的DC/RC需求的情况下绘制纹理(只需要目标窗口)......但是纹理的大小在某些卡片/驱动程序上的限制比屏幕分辨率要大得多,你必须使用更多的纹理覆盖。 – Spektre

回答

1

MemDCs会自动将您放回旧的OpenGL-1.1软件光栅化器。这个光栅化程序非常有限,不支持任何类型的现代功能,如FBO,PBuffers等。

如果你想要一个GPU加速的OpenGL上下文,你需要在普通窗口(或PBuffer DC上创建它,但要获得一个PBuffer DC,你首先需要一个窗口)。您只需要获取上下文的窗口,您不必在此处进行渲染,并且窗口可以始终保持隐藏状态(省略创建过程的ShowWindow调用)。通过为窗口设置有效的像素格式,在其HDC上创建OpenGL上下文。

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

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