我在使用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