【发布时间】:2014-02-10 08:34:19
【问题描述】:
我在使用 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);
}
如果我在没有 memDC 和 CreateContext 的情况下在 m_hDC 上运行这个程序,那么什么都不是问题。在窗口上渲染得很好,位图文件写得很好。但我想在屏幕外渲染,只保存位图文件。我该如何处理?
【问题讨论】:
-
感谢您的回答!但是我该如何使用 SelectObject 呢?能再推荐给我吗?
-
我在初始化步骤中插入了新代码,例如 m_hMemBmp = ::CreateCompatibleBitmap(m_hDC, m_WndWidth, m_WndHeight); ::SelectObject(memDC, m_hMemBmp); 但仍然没有任何变化
-
我使用 Borland,在它下我从来没有运行过位图渲染。因此,如果您的问题仍然存在,您可以在不需要任何额外 DC/RC 的情况下绘制到纹理(只需要目标窗口)......但是纹理的大小在某些卡/驱动程序上受到限制,远远超过屏幕分辨率,因此可能是你必须使用更多的纹理来覆盖。
标签: windows opengl off-screen