当前位置: 首页 > 知识库问答 >
问题:

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

储思聪
2023-03-14

我试图为我通过OpenGL渲染的每一帧写位图文件。

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

这是我的部分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个答案

桂玉石
2023-03-14

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

 类似资料:
  • 我写了一个< code>OpenGL代码用于在屏幕上渲染图像。我使用< code>GLUT来创建一个窗口和回调,但是我想在< code>win32窗口中而不是在< code>GLUT中呈现图像,基本上我们有一个< code > CreateWindowEx() API来在< code>win32中创建窗口,并且我们有一个< code>HWND(句柄),以便我们可以将此句柄传递给< code>HDC

  • 问题内容: 我正在为我的第一个深度Pyglet项目开发2D Minecraft克隆,但遇到了一个问题。每当我在屏幕上有相当数量的块时,帧速率都会急剧下降。 这是我的渲染方法:我使用字典,键为元组(代表块的坐标),项为纹理。 我遍历整个字典并渲染每个块: PS sx和sy是屏幕滚动的坐标偏移 我想知道是否有一种方法可以更有效地渲染每个块。 问题答案: 我将尽力解释为什么以及如何在不真正了解代码外观的

  • 所以我有一个非常简单的glsl着色器,可以用纹理和平行光渲染对象。 现在我有一个非常艰难的时间试图得到的纹理显示,其他一切工作,除此之外。 当我禁用着色器(glUseProgram(0))时,纹理以黑色和白色渲染,但当我启用它时,整个网格是单一颜色,没有纹理,当我尝试不同的纹理时,它会改变颜色。 这就是我加载纹理的方式 这就是我如何绑定我的纹理 这是我的顶点着色器 这是我的碎片着色器 最后但并非最

  • 基本图像渲染 外部资源渲染 摄像机 材质系统 材质资源 Effect 渲染组件参考 Sprite 组件参考 Label 组件参考 LabelOutline 组件参考 LabelShadow 组件参考 Mask 组件参考 MotionStreak 组件参考 ParticleSystem 组件参考 TiledMap 组件参考 TiledTile 组件参考 Spine 组件参考 DragonBones

  • 我如何才能实现在android图像滑块,显示下一个和上一个图像的某些部分,如在图像中所示。 谢谢你的任何帮助。