初始化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_SAMPLE_BUFFERS_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 }
时间: 2024-08-06 19:52:36

初始化glew,创建OpenGL渲染上下文的相关文章

OpenGL 渲染上下文-context

context理解 OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色.是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性.在OpenGL 3.0版本之前,OpenGL创建Context都是一致的,随着升级会新增一些内容(例如从OpenGL1.1升级到1.5,会新增一些状态变量或者属性,并添加一些设置这些内容的函数),整体上来说没有什么大的变化.但是

《绘图前设置:像素格式——PIXELFORMATDESCRIPT、设备上下文、渲染上下文》

  像素格式——PIXELFORMATDESCRIPT.设备上下文.渲染上下文 在OpenGL对窗口进行渲染之前,必须根据渲染需要对窗口进行配置. 需要硬件渲染还是软件渲染? 渲染使用但缓冲还是双缓冲模式? 是否需要深度缓冲区? 是否需要模板.目标Alpha或累计缓冲区? 当为窗口设置这些参数之后,就无法对它们进行修改.为了从一个只有深度缓冲区和颜色缓冲区的窗口切换到一个带有模板缓冲区的窗口,必须销毁第一个窗口,然后根据需要重新创建一个窗口. 像素格式是OpenGL窗口的重要属性,它包括是否使用

创建OpenGL Context(WGL)

创建OpenGL Context是初始化OpenGL的一部分.只有在此之后才能使用OpenGL. 关于platform的注意事项 创建OpenGL context之后才会存在OpenGL.这个创建过程不归OpenGL Specification管,而是归各个platform的API管.本文讨论基于Windows的初始化过程.许多Windows上的初始化函数是以”wgl”开头的. 本文假设读者知道Win32 API的基础知识.读者应知道window handle(HWND)和device cont

CSharpGL(31)[译]OpenGL渲染管道那些事

+BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一个不错的突破口. 本文通过阅读.翻译和扩展(https://www.opengl.org/wiki/Rendering_Pipeline_Overview)的方式,来逐步回顾总结一下OpenGL渲染管道,从而串联起OpenGL的所有知识点,并期望能在更高的层次上有所领悟. 另外,(https://www.opengl.org/wiki/Rendering_

OpenGL渲染流程

一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”.从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度. 二.管线 管线这个术语描述了opengl渲染的整个过程.openGL采用cs模型:c是cpu,s是GPU,c给s的输入是vertex信息和Texture信息,s的输出是显示器上显示的图像.下面这2个图比较清楚的讲解了opengl的渲染管线. 相信没有opengl基础的应该看不懂,下面会简单的介绍这个流程,再看下文之前,建议先看GPU大百科全书系列文

渲染上下文Rendering Context

渲染描述表,包含一次渲染所需的全部数据.用于提交给游戏渲染引擎的渲染器进行渲染 -------------------------------------------------------------------- 如果把渲染引擎看做一个画家,那么画家开始作画之前需要做一系列的准备工作,譬如:布置好场景,摆好画架,钉好画布,调整好灯光,准备号画笔油彩,站好位置,然后才能开始下笔作画. 前期的这一系列准备过程在D3D和Ogl这样的渲染Api中对应了一系列的接口函数,这些函数初看起来又多又乱,有时

从头开始编写一个Orchard网上商店模块(5) - 创建和渲染ProductCatalog的内容类型

原文地址: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-5创建和渲染ProductCatalog的内容类型 这是从头开始编写一个新的Orchard模块的教程的第5篇.对于本教程的概述,请参阅介绍. 为了网站的访问者能够将产品添加到他们的购物车,我们需要一个产品目录.产品目录可以是一个简单的产品清单.然而,在本教程中,我们希望主题作者能够接管渲染(r

单链表的初始化和创建(尾插法)

1 #include<stdlib.h> 2 #include<stdio.h> 3 typedef struct Node 4 { 5 int data; 6 struct Node *next; 7 }Node,*LinkList; 8 9 void initList(LinkList *L) 10 { 11 (*L) = NULL; 12 printf("初始化成功\n"); 13 } 14 15 LinkList creatList(int n) 16

mysql8.0 部署、初始化和创建实例

mysql8.0部署.初始化和创建实例 环境信息:centos 7.4.1708mysql 8.0.11 1.下载解压缩mysql包 cd /usr/local/ wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz tar xzvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz mv mysql-8.0.11-linux-gli