有些时候直接创建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
OpenGL在MFC中的使用总结(三)
时间: 2024-12-26 04:54:13