我怎样才能脱屏渲染?

使用OpenGL进行离屏渲染时出现问题。 我search了很多关于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运行这个程序,没有什么关系。 在窗口上写得很好,写得很好的位图文件。 但我想要在屏幕外渲染,只保存位图文件。 我该如何处理?

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

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

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

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