Как я могу сделать рендеринг вне экрана?
У меня проблема с рендерингом вне экрана с OpenGL. Я много искал о FBO и PBO, но ничего не помогло мне. Я предполагаю, что дело было в memDC, который был сделан CreateCompatibleDC.
Вот часть моего кода
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, ничего не было важно. Хорошо отображается на окне, хорошо написанный файл растрового изображения. Но я хочу сделать рендеринг за кадром и сохранить только растровые файлы. Как я могу справиться с этим?
1 ответ
MemDCs автоматически вернет вас к старому растеризатору программного обеспечения OpenGL-1.1. Этот растеризатор очень ограничен, не поддерживает какие-либо современные функции, такие как FBO, PBuffers и так далее.
Если вам нужен контекст OpenGL с GPU-ускорением, вам нужно создать его в обычном окне (или DC PBuffer, но для получения DC PBuffer вам сначала нужно окно). Вам нужно окно только для получения контекста, вам не нужно отображать его, и окно может оставаться скрытым все время (пропустите ShowWindow
вызов процесса создания). С допустимым набором пиксельных форматов для окна создайте контекст OpenGL на его HDC.
Так как у вас уже есть окно, просто пойдите с этим тогда.
С помощью контекста OpenGL из обычного окна вы можете использовать FBO для вывода за пределы экрана.