2014-02-10 93 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進行離屏渲染。