我在使用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,什麼也沒有問題。在窗口上進行渲染,寫得很好的位圖文件。但我想在屏幕外渲染,只保存位圖文件。我該如何處理?
感謝您的回答!但我怎麼才能使用SelectObject呢?你能再次推薦我嗎? – phraust
我在初始化步驟中插入了新代碼,如__m_hMemBmp = :: CreateCompatibleBitmap(m_hDC,m_WndWidth,m_WndHeight); :: SelectObject(memDC,m_hMemBmp); __ 但仍然沒有任何變化 – phraust
我使用Borland,在它下面,我從來沒有得到位圖渲染運行。所以如果你的問題持續存在,你可以在沒有任何額外的DC/RC需求的情況下繪製紋理(只需要目標窗口)......但是紋理的大小在某些卡片/驅動程序上的限制比屏幕分辨率要大得多,你必須使用更多的紋理覆蓋。 – Spektre