OpenGL在MFC中的使用总结(三)——离屏渲染

来源:互联网 发布:钢结构楼梯踏步计算法 编辑:程序博客网 时间:2024/06/04 19:53
有些时候直接创建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


1 1