我想用我已经通过OpenGL渲染的内容来编写位图图像文件

时间:2014-02-05 09:54:30

标签: opengl file-io bitmap

我正在尝试为通过OpenGL呈现的每个帧写入位图文件。

请注意我不会读取位图,我会写新的BITMAP文件。

这是我的C ++代码的一部分

void COpenGLWnd::ShowinWnd(int ID)
{
    if(m_isitStart == 1)
    {
        m_hDC = ::GetDC(m_hWnd);
        SetDCPixelFormat(m_hDC);

         m_hRC = wglCreateContext(m_hDC);
        VERIFY(wglMakeCurrent(m_hDC, m_hRC));
         m_isitStart = 0;
    }

    GLRender();

    CDC* pDC = CDC::FromHandle(m_hDC);
    //pDC->FillSolidRect(0, 0, 100, 100, RGB(100, 100, 100));
    CRect rcClient;
    GetClientRect(&rcClient);
    SaveBitmapToDirectFile(pDC, rcClient, _T("a.bmp"));

    SwapBuffers(m_hDC);
}

“GLRender”是可以在MFC窗口上呈现的功能。 “SaveBitmapToDirectFile”是从参数pDC写入一个新的位图图像文件的函数,如果我在第二行上删除了那个双斜杠,我可以检查它是否正常工作,因为左上方的灰色框仅在“a”处绘制。 BMP“

那么m_hDC去了哪里?我不知道为什么渲染的场景没有写在“a.bmp”上。

这是GLRender代码,但我不认为这个功能是问题,因为它可以渲染图像并在窗口上打印出来。

void COpenGLWnd::GLFadeinRender()
{
    glViewport(0,0, m_WndWidth, m_WndHeight);
    glOrtho(0, m_WndWidth, 0, m_WndHeight, 0, 100);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_BLEND);

    glBlendFunc(m_BlendingSrc, m_BlendingDest);

    glPixelTransferf(GL_ALPHA_SCALE,(GLfloat)(1-m_BlendingAlpha));

    glPixelZoom((GLfloat)m_WndWidth/(GLfloat)m_w1, -(GLfloat)m_WndHeight/(GLfloat)m_h1);    

    glRasterPos2f(0, m_WndHeight);                                          
    glDrawPixels((GLsizei)m_w1, (GLsizei)m_h1, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_pImageA);

    glPixelTransferf(GL_ALPHA_SCALE,(GLfloat)m_BlendingAlpha);                  
    glPixelZoom((GLfloat)m_WndWidth/(GLfloat)m_w2, -(GLfloat)m_WndHeight/(GLfloat)m_h2);    

    glRasterPos2f(0, m_WndHeight);                              
    glDrawPixels((GLsizei)m_w2, (GLsizei)m_h2, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_pImageB);    

    glFlush();  
}

1 个答案:

答案 0 :(得分:0)

我猜你正在使用MFC或Windows API函数从窗口捕获位图。问题是你需要使用glReadPixels从GL上下文中获取图像 - winapi无法做到这一点。