zoukankan      html  css  js  c++  java
  • 初始化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 }
  • 相关阅读:
    [转]VS2010几款超赞的扩展辅助工具总结
    从客户端中检测到有潜在危险的Request.Form 值
    面试系列28 分布式服务接口的幂等性如何设计
    面试系列26 如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试
    面试系列25 dubbo的spi思想是什么
    面试系列24 dubbo负载均衡策略和集群容错策略
    面试系列23
    面试系列22 dubbo的工作原理
    面试系列21 为什么要进行系统拆分
    面试系列20 生产环境中的redis是怎么部署的
  • 原文地址:https://www.cnblogs.com/lc-cnblong/p/3982105.html
Copyright © 2011-2022 走看看