我在使用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的情况下运行这个程序,那就没什么了不起的。在窗口上渲染得很好,写得很好的位图文件。但我想在屏幕外渲染,只保存位图文件。我怎么处理这个?
答案 0 :(得分:1)
MemDC将自动退回旧的OpenGL-1.1软件光栅化器。这种光栅化器非常有限,不支持任何类型的现代功能,如FBO,PBuffers等。
如果你想要GPU加速的OpenGL上下文,你需要在常规窗口(或PBuffer DC上)创建它,但要获得PBuffer DC,你首先需要一个窗口。您需要窗口只是为了获取上下文,您不必在那里渲染,窗口可以一直保持隐藏(省略创建过程的ShowWindow
调用)。使用为窗口设置的有效像素格式,在其HDC上创建OpenGL上下文。
既然你已经有了一个窗口,那就去吧。
使用常规窗口中的OpenGL上下文,您可以使用FBO进行离屏渲染。