初始化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,初始化glew 35 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 else 54 { 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, // 支持OpenGL 37 WGL_ACCELERATION_ARB ,WGL_FULL_ACCELERATION_ARB , // 硬件加速 38 WGL_DOUBLE_BUFFER_ARB,GL_TRUE, // 双缓冲 39 WGL_PIXEL_TYPE_ARB,WGL_TYPE_RGBA_ARB, // RGBA 40 WGL_COLOR_BITS_ARB,32, // 颜色位数32 41 WGL_DEPTH_BITS_ARB,24, // 深度位数24 42 WGL_STENCIL_BITS_ARB,8, // 模板位数8 43 WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB, // 双缓冲swap方式直接交换 44 WGL_SAMPLES_ARB, 4, // 4倍抗锯齿 45 0 46 }; 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 0 54 }; 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 }