OpenGL于MFC使用汇总(三)——离屏渲染

有时直接创建OpenGL形式不适合,或者干脆不同意然后创建一个表单,正如我现在这个项目,创建窗体不显示,它仅限于主框架。而我只是ActiveX里做一些相关工作,那仅仅能用到OpenGL的离屏渲染技术了~即不直接绘制到窗体上,而是绘制到一张位图上。然后再次调用这张位图实现兴许的工作。

以下就总结怎么使用所谓的“离屏渲染”。

    const int WIDTH = 500;
    const int HEIGHT = 500;

    // Create a memory DC compatible with the screen
    HDC hdc = CreateCompatibleDC(0);
    if (hdc == 0) cout<<"Could not create memory device context";

    // Create a bitmap compatible with the DC
    // must use CreateDIBSection(), and this means all pixel ops must be synchronised
    // using calls to GdiFlush() (see CreateDIBSection() docs)
    BITMAPINFO bmi = {
        { sizeof(BITMAPINFOHEADER), WIDTH, HEIGHT, 1, 32, BI_RGB, 0, 0, 0, 0, 0 },
        { 0 }
    };
    unsigned char *pbits; // pointer to bitmap bits
    HBITMAP hbm = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void **) &pbits,
        0, 0);
    if (hbm == 0) cout<<"Could not create bitmap";

    //HDC hdcScreen = GetDC(0);
    //HBITMAP hbm = CreateCompatibleBitmap(hdcScreen,WIDTH,HEIGHT);

    // Select the bitmap into the DC
    HGDIOBJ r = SelectObject(hdc, hbm);
    if (r == 0) cout<<"Could not select bitmap into DC";

    // Choose the pixel format
    PIXELFORMATDESCRIPTOR pfd = {
        sizeof (PIXELFORMATDESCRIPTOR), // struct size
        1, // Version number
        PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL, // use OpenGL drawing to BM
        PFD_TYPE_RGBA, // RGBA pixel values
        32, // color bits
        0, 0, 0, // RGB bits shift sizes...
        0, 0, 0, // Don't care about them
        0, 0, // No alpha buffer info
        0, 0, 0, 0, 0, // No accumulation buffer
        32, // depth buffer bits
        0, // No stencil buffer
        0, // No auxiliary buffers
        PFD_MAIN_PLANE, // Layer type
        0, // Reserved (must be 0)
        0, // No layer mask
        0, // No visible mask
        0, // No damage mask
    };
    int pfid = ChoosePixelFormat(hdc, &pfd);
    if (pfid == 0) cout<<"Pixel format selection failed";

    // Set the pixel format
    // - must be done *after* the bitmap is selected into DC
    BOOL b = SetPixelFormat(hdc, pfid, &pfd);
    if (!b) cout<<"Pixel format set failed";

    // Create the OpenGL resource context (RC) and make it current to the thread
    HGLRC hglrc = wglCreateContext(hdc);
    if (hglrc == 0) cout<<"OpenGL resource context creation failed";
    wglMakeCurrent(hdc, hglrc);

    // Draw using GL - remember to sync with GdiFlush()
    GdiFlush();
    /*
	详细的绘制函数~~~~~~~~~~~~~~我就不写了
    */

    // Clean up
    wglDeleteContext(hglrc); // Delete RC
    SelectObject(hdc, r); // Remove bitmap from DC
    DeleteObject(hbm); // Delete bitmap
    DeleteDC(hdc); // Delete DC

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-08-05 19:30:09

OpenGL于MFC使用汇总(三)——离屏渲染的相关文章

关于OpenGL Framebuffer Object、glReadPixels与离屏渲染

最近写论文需要用到离屏渲染(主要是因为模型太大普通窗口绘制根本做不了),于是翻阅了红宝书查了下相关api和用法.中文版的红宝书可读性有点差,很多地方翻译地晦涩,但好歹读起来比较快,主要相关章节为第8章和第10章(可以连带把第9章读完以后写GLSL会顺利成章).貌似superbible可读性更强,但红宝书讲得也差不多了就没再继续看. 由于红宝书过于学术,想动手还是最好查查网上的资料,于是把一些还可以的资料列一下. 关于FBO: OpenGL中的FBO对象(含源码) OpenGL的帧缓冲对象和浮点纹

OpenGL在MFC中的使用总结(三)

有些时候直接创建OpenGL窗口不适合,或者根本不允许再创建窗口,就像我现在的这个项目,创建的窗口显示不出来,被主框架限定,而我只能在ActiveX控件的子类里做一些相关工作,那只能用到OpenGL的离屏渲染技术了~即不直接绘制到窗口上,而是绘制到一张位图上,然后再次调用这张位图实现后续的工作. 下面就总结怎么使用所谓的"离屏渲染". const int WIDTH = 500; const int HEIGHT = 500; // Create a memory DC compati

OpenGL在MFC中的使用总结(一)

项目中要画3D显示的模型,于是要用到OpenGL,加上是在MFC中,而且是在MFC中的ActiveX中使用,再而且鉴于他们程序主框架的设定,常规的方法还不一定能实现.所以还是查过不少资料,在此一一总结一下.首先总结最基础的一些东西. 一.按照讲课的逻辑,先讲点原理性的东西~ GDI是通过设备描述表(Device Context,以下简称"DC")来绘图,而OpenGL是通过渲染描述表(Rendering Context,以下简称"RC").每一个GDI命令需要传给它

openGL初学函数解释汇总

openGL初学函数解释汇总 1.GLUT工具包提供的函数 //GLUT工具包所提供的函数 glutInit(&argc, argv);//对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);//初始化显示模式,(颜色使用RGB,单缓冲GLUT_SINGLE\GLUT_DOUBLE双缓冲) glutInitWindowPosition(100, 100);//初始化窗口位置 glutInit

Android OpenGL ES 离屏渲染(offscreen render)

通常在Android上使用OpenGL ES,都是希望把渲染后的结果显示在屏幕上,例如图片处理.模型显示等.这种情况下,只需要使用Android API中提供的GLSurfaceView类和Renderer类,在这两个类提供的初始化.回调函数中设置/编写相应的代码即可.不过,如果不希望把渲染结果显示在屏幕上,也就是所说的离屏渲染(offscreen render),这两个类就帮不上忙了.在此介绍一下如何在Android系统上做OpenGL ES 的离屏渲染. 1.基础知识 要想使用OpenGL

OpenGL在MFC中的使用总结(二)

有些时候用到OpenGL需要每次进行配置,有点麻烦,可以直接基于CWND派生一个OpenGL类,在需要的时候直接用就可以了.下面附赠上这样一个类,其中删掉了我项目具体绘制的一些东西,如有错误不能用请联系我~~~ h文件: #if !defined(AFX_OPENGL_H__38B5D1C8_2DFF_4A7D_9A99_3AC401C19D72__INCLUDED_) #define AFX_OPENGL_H__38B5D1C8_2DFF_4A7D_9A99_3AC401C19D72__INC

glBindFramebuffer() 离屏渲染+双缓存+读取opengl像素 glReadPixels()

Opengl4.0中可以进行离屏渲染,即创造一个帧缓存对象(FBO),绑定一个帧缓存对象后,所有对Op--engl的操作都会针对这个帧缓存对象执行.而最近做项目时,在做一个拍照功能--读取Opengl渲染出的像素,并存入到BMP位图中.项目采用的是Opengl1.0和Opengl4.3结合的方法,并且两者的使用相对独立.使用旧的Opengl方法运行程序时,通过 glReadBuffer(GL_FRONT);//指定要读取的缓存 glReadPixels(0, 0, width, height,

开始我的GL离屏渲染绑定[转]

地址: http://wiki.woodpecker.org.cn/moin/lilin/swig-glBmpContext 呵呵,有了第一次的经验,我们就要开始我们的GL离屏渲染的绑定了. 关 于OpenGL的离屏渲染,前面已经有一些涉及了.再说一下吧,OpenGL有两种渲染方式:一种是通过操作系统打开窗口进行渲染,然后可以直接在屏幕上 显示,这种渲染方式叫做屏幕渲染.一种通过在内存中一块位图区域内渲染,这种渲染方式在没有通过SwapBuffer方式前不可以在屏幕上显示,所以这种 方法叫离屏渲

离屏渲染学习笔记

一.概念理解 OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. Off-Screen Rendering 意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作. 二.离屏渲染的是是非非 相比于当前屏幕渲染,离屏渲染的代价是很高的,主要体现在两个方面: 创建新缓冲区 要想进行离屏渲染,首先要创建一个新的缓冲区. 上下文切换 离屏渲染的整个过程,需要多次切换上下文