首页 > 代码库 > 初始化glew,创建OpenGL渲染上下文

初始化glew,创建OpenGL渲染上下文

 1 void RegisterWinDowClass(HINSTANCE hInstance,std::string className,WNDPROC proc) 2 { 3     WNDCLASS wndClass; 4     wndClass.cbClsExtra = 0; 5     wndClass.cbWndExtra = 0; 6     wndClass.hbrBackground = (HBRUSH)::GetStockObject(GRAY_BRUSH); 7     wndClass.hCursor = ::LoadCursor(NULL,IDC_ARROW); 8     wndClass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION); 9     wndClass.hInstance = hInstance;10     wndClass.lpfnWndProc = proc;11     wndClass.lpszClassName = className.c_str();12     wndClass.lpszMenuName = NULL;13     wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;14     ::RegisterClass(&wndClass);15 }
 1 bool InitGlewLib(HINSTANCE hInstance) 2 { 3     RegisterWinDowClass(hInstance,"Fake",MainWinProc); 4  5     HWND hWnd = ::CreateWindow("Fake","OpenGL",WS_OVERLAPPEDWINDOW, 6         CW_USEDEFAULT,CW_USEDEFAULT,width,heigtht, 7         NULL,NULL,hInstance,NULL); 8  9     HDC hDC = ::GetDC(hWnd);10     HGLRC hRc;11     ::PIXELFORMATDESCRIPTOR pfd;12     //memset(&pfd,0,sizeof(pfd));13 14     //pfd.nVersion = 1;15     //pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);16     //pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;17     //pfd.iPixelType = PFD_TYPE_RGBA;18     //pfd.cColorBits = 32;19     //pfd.cDepthBits = 32;20     //pfd.iLayerType = PFD_MAIN_PLANE;       21 22     //int iPixelFormat = ::ChoosePixelFormat(hDC,&pfd);23     //if (iPixelFormat == 0)24     //{25     //    DestroyWindow(hWnd);26     //    return false;27     //}28     /**************************************************************************29     30     1,注册fake窗口的class,如果和主窗口是同名的class,会使初始化失败31     2,选择1号格式索引作为临时索引32     3,根据设备上下文创建渲染上下文33     4,绑定到当前上下文34     5,初始化glew35     6,解除上下文绑定,销毁窗口36     **************************************************************************/37 38     int iPixelFormat = 1;39     if (::SetPixelFormat(hDC,iPixelFormat,&pfd))40     {41         hRc = ::wglCreateContext(hDC);42         if (::wglMakeCurrent(hDC,hRc))43         {44             GLenum retVal = glewInit();45             wglMakeCurrent(NULL,NULL);46             wglDeleteContext(hRc);47             DestroyWindow(hWnd);48             return retVal == GLEW_OK;49         }50         wglDeleteContext(hRc);51         DestroyWindow(hWnd);52     }53     else54     {55         DestroyWindow(hWnd);56     }57     58     return false;59 }
 1 bool InitOpenGL(HWND hWnd,HINSTANCE hInstance) 2 { 3     if (!InitGlewLib(hInstance)) 4     { 5         ::MessageBox(NULL,"glew init Error",NULL,MB_OK); 6         return 0; 7     } 8  9     if(!WGLEW_ARB_create_context || !WGLEW_ARB_pixel_format)10         return false;11     HDC hDC = ::GetDC(hWnd);12     PIXELFORMATDESCRIPTOR pfd;13     //memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));14     //pfd.nSize        = sizeof(PIXELFORMATDESCRIPTOR);15     //pfd.nVersion   = 1;16     //pfd.dwFlags    = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;17     //pfd.iPixelType = PFD_TYPE_RGBA;18     //pfd.cColorBits = 32;19     //pfd.cDepthBits = 32;20     //pfd.iLayerType = PFD_MAIN_PLANE;21 22     /**************************************************************************23     24     1,填充像素格式属性 (缓冲区的初始化)25     2,填充上下文属性 (用于设置指定OpenGL版本)26     3,根据像素格式属性选择设备上下文合适像素格式索引。wglChoosePixelFormatARB(...)27     4,将得到的像素格式索引绑定到设备上下文。SetPixelFormat(...)28     5,根据设备上下文,及上下文属性设置创建一个OpenGL渲染上下文。wglCreateContextAttribsARB(...)29     6,将渲染上下文与设备上下文绑定 wglMakeCurrent(...)30      31     **************************************************************************/32  33     const int iPixelFormatAttributeList[] =34     {35         WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,                        // 绘制到窗口36         WGL_SUPPORT_OPENGL_ARB,GL_TRUE,                            // 支持OpenGL37         WGL_ACCELERATION_ARB ,WGL_FULL_ACCELERATION_ARB ,        // 硬件加速38         WGL_DOUBLE_BUFFER_ARB,GL_TRUE,                            // 双缓冲39         WGL_PIXEL_TYPE_ARB,WGL_TYPE_RGBA_ARB,                    // RGBA40         WGL_COLOR_BITS_ARB,32,                                    // 颜色位数3241         WGL_DEPTH_BITS_ARB,24,                                    // 深度位数2442         WGL_STENCIL_BITS_ARB,8,                                    // 模板位数843         WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB,                // 双缓冲swap方式直接交换44         WGL_SAMPLE_BUFFERS_ARB, 4,                                // 4倍抗锯齿45         046     };47 48     const int iContextAttributeList[] =49     {50         WGL_CONTEXT_MAJOR_VERSION_ARB,3,                        // 主版本号51         WGL_CONTEXT_MINOR_VERSION_ARB,3,                        // 次版本号52         WGL_CONTEXT_FLAGS_ARB,WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,53         054     };55 56     int iPixelFormat,iNumFormat;57     wglChoosePixelFormatARB(hDC,iPixelFormatAttributeList,NULL,58         1,&iPixelFormat,(UINT *)&iNumFormat);59 60     if (!SetPixelFormat(hDC,iPixelFormat,&pfd))61     {62         //int error = ::GetLastError();63         return false;64     }65     HGLRC hRC = wglCreateContextAttribsARB(hDC,NULL,iContextAttributeList);66     if (hRC) 67     {68         ::wglMakeCurrent(hDC,hRC);69         return true;70     }71     return false;72 }

 

初始化glew,创建OpenGL渲染上下文