Как я могу сделать рендеринг вне экрана?

У меня проблема с рендерингом вне экрана с 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 для вывода за пределы экрана.

Другие вопросы по тегам