初始化glew,创建OpenGL渲染上下文
void RegisterWinDowClass(HINSTANCE hInstance,std::string className,WNDPROC proc)
{
WNDCLASS wndClass;
wndClass.cbClsExtra = ;
wndClass.cbWndExtra = ;
wndClass.hbrBackground = (HBRUSH)::GetStockObject(GRAY_BRUSH);
wndClass.hCursor = ::LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = proc;
wndClass.lpszClassName = className.c_str();
wndClass.lpszMenuName = NULL;
wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
::RegisterClass(&wndClass);
}
bool InitGlewLib(HINSTANCE hInstance)
{
RegisterWinDowClass(hInstance,"Fake",MainWinProc); HWND hWnd = ::CreateWindow("Fake","OpenGL",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,width,heigtht,
NULL,NULL,hInstance,NULL); HDC hDC = ::GetDC(hWnd);
HGLRC hRc;
::PIXELFORMATDESCRIPTOR pfd;
//memset(&pfd,0,sizeof(pfd)); //pfd.nVersion = 1;
//pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
//pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
//pfd.iPixelType = PFD_TYPE_RGBA;
//pfd.cColorBits = 32;
//pfd.cDepthBits = 32;
//pfd.iLayerType = PFD_MAIN_PLANE; //int iPixelFormat = ::ChoosePixelFormat(hDC,&pfd);
//if (iPixelFormat == 0)
//{
// DestroyWindow(hWnd);
// return false;
//}
/************************************************************************** 1,注册fake窗口的class,如果和主窗口是同名的class,会使初始化失败
2,选择1号格式索引作为临时索引
3,根据设备上下文创建渲染上下文
4,绑定到当前上下文
5,初始化glew
6,解除上下文绑定,销毁窗口
**************************************************************************/ int iPixelFormat = ;
if (::SetPixelFormat(hDC,iPixelFormat,&pfd))
{
hRc = ::wglCreateContext(hDC);
if (::wglMakeCurrent(hDC,hRc))
{
GLenum retVal = glewInit();
wglMakeCurrent(NULL,NULL);
wglDeleteContext(hRc);
DestroyWindow(hWnd);
return retVal == GLEW_OK;
}
wglDeleteContext(hRc);
DestroyWindow(hWnd);
}
else
{
DestroyWindow(hWnd);
} return false;
}
bool InitOpenGL(HWND hWnd,HINSTANCE hInstance)
{
if (!InitGlewLib(hInstance))
{
::MessageBox(NULL,"glew init Error",NULL,MB_OK);
return ;
} if(!WGLEW_ARB_create_context || !WGLEW_ARB_pixel_format)
return false;
HDC hDC = ::GetDC(hWnd);
PIXELFORMATDESCRIPTOR pfd;
//memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
//pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
//pfd.nVersion = 1;
//pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
//pfd.iPixelType = PFD_TYPE_RGBA;
//pfd.cColorBits = 32;
//pfd.cDepthBits = 32;
//pfd.iLayerType = PFD_MAIN_PLANE; /************************************************************************** 1,填充像素格式属性 (缓冲区的初始化)
2,填充上下文属性 (用于设置指定OpenGL版本)
3,根据像素格式属性选择设备上下文合适像素格式索引。wglChoosePixelFormatARB(...)
4,将得到的像素格式索引绑定到设备上下文。SetPixelFormat(...)
5,根据设备上下文,及上下文属性设置创建一个OpenGL渲染上下文。wglCreateContextAttribsARB(...)
6,将渲染上下文与设备上下文绑定 wglMakeCurrent(...) **************************************************************************/ const int iPixelFormatAttributeList[] =
{
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, // 绘制到窗口
WGL_SUPPORT_OPENGL_ARB,GL_TRUE, // 支持OpenGL
WGL_ACCELERATION_ARB ,WGL_FULL_ACCELERATION_ARB , // 硬件加速
WGL_DOUBLE_BUFFER_ARB,GL_TRUE, // 双缓冲
WGL_PIXEL_TYPE_ARB,WGL_TYPE_RGBA_ARB, // RGBA
WGL_COLOR_BITS_ARB,, // 颜色位数32
WGL_DEPTH_BITS_ARB,, // 深度位数24
WGL_STENCIL_BITS_ARB,, // 模板位数8
WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB, // 双缓冲swap方式直接交换
WGL_SAMPLES_ARB, , // 4倍抗锯齿 }; const int iContextAttributeList[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB,, // 主版本号
WGL_CONTEXT_MINOR_VERSION_ARB,, // 次版本号
WGL_CONTEXT_FLAGS_ARB,WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, }; int iPixelFormat,iNumFormat;
wglChoosePixelFormatARB(hDC,iPixelFormatAttributeList,NULL,
,&iPixelFormat,(UINT *)&iNumFormat); if (!SetPixelFormat(hDC,iPixelFormat,&pfd))
{
//int error = ::GetLastError();
return false;
}
HGLRC hRC = wglCreateContextAttribsARB(hDC,NULL,iContextAttributeList);
if (hRC)
{
::wglMakeCurrent(hDC,hRC);
return true;
}
return false;
}
初始化glew,创建OpenGL渲染上下文的更多相关文章
- OpenGL 渲染上下文-context
context理解 OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色.是否有光照计算 ...
- opengl学习笔记(二):使用OpenCV来创建OpenGL窗口
通常的增强现实应用需要支持OpenGL的OpenCV来对真实场景进行渲染.从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL.这意味着在OpenCV中可轻松渲染任何3D内容. 若要在Op ...
- 一个使用openGL渲染的炫丽Android动画库
android-magic-surface-view 这是一个 android 动画特效库, 可以实现各种炫酷动画. github地址: https://github.com/gplibs/andro ...
- 一个使用openGL渲染的炫丽Android动画库二(碎片化曲面动画)
续一个使用openGL渲染的炫丽Android动画库 MagicSurfaceView v1.1.0发布, 新增碎片化曲面动画 地址:https://github.com/gplibs/android ...
- 创建OpenGL Context(WGL)
创建OpenGL Context(WGL) 创建OpenGL Context是初始化OpenGL的一部分.只有在此之后才能使用OpenGL. 关于platform的注意事项 创建OpenGL cont ...
- [转贴]Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程
看了opengles有一段时间了,算是了解了一下下.然后,就在基本要决定还是回归cocos2dx 3.2的,看了这篇好文章,欣喜转之~ 推荐看原帖: Cocos2d-x3.2与OpenGL渲染总结(一 ...
- 《绘图前设置:像素格式——PIXELFORMATDESCRIPT、设备上下文、渲染上下文》
转载地址:https://www.cnblogs.com/wiener-zyj/p/4159745.html 像素格式——PIXELFORMATDESCRIPT.设备上下文.渲染上下文 在OpenG ...
- CSharpGL(31)[译]OpenGL渲染管道那些事
CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...
- OpenGL渲染流程
一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”.从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度. 二.管线 管线这个术语描述了opengl渲染的整个 ...
随机推荐
- 套接字I/O模型之WSAEventSelect
今天我又学习了一种新的套接字I/O模型------WSAEventSelect,他与WSAAsyncSelect一样也是一种异步事件通知模型,不同的是WSAAsyncSelect是与窗口句柄关联在一起 ...
- 软件工程课堂练习——N层电梯只停一层求乘客爬楼层数最少(基本方法+优化方法)
题目: •石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停.信1201-1班的张一东觉得在每层都停觉得不耐烦. •由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某 ...
- pxe+preseed安装配置
Ubuntu Server 部署手册 pxe+tftp+vsftp+apache2 ========================================================== ...
- yii的常用配置文件
<?php return array( 'basePath' => dirname(__FILE__).DIRECTORY_SEPARATOR.'..', //当前应用根目录路径 'nam ...
- 计算器软件的代码实现 (策略模式+asp.net)
一 策略模式代码的编写 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ...
- IEEE802.11数据帧在Linux上的抓取
IEEE802.11数据帧在Linux上的抓取终于得到了梦寐的<802.11无线网络权威指南>,虽然是复印版本,看起来也一样舒服,光看书是不行的,关键还是自己练习,这就需要搭建一个舒服的实 ...
- Orchard 候补神器说明
Orchard学习视频已登录百度传课: http://www.chuanke.com/3027295-124882.html 获取Orchard候补神器请加qq群432158140 ! 候补神器是一 ...
- [解决方案] 当 IDENTITY_INSERT 设置为 OFF 时
当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'tbUser' 中的标识列插入显式值. 解决:这个情况是你的表里面,有一列数据类型是IDENTITY的,也就是数据库自动递增列对于自 ...
- c++11 lambda(匿名函数)
#include <iostream> #include <functional> using namespace std::placeholders; //lambda即匿名 ...
- .net程序集强名称签名实践
引用: http://www.cnblogs.com/cpcpc/archive/2011/01/17/2123086.html 强名称是由程序集的标识加上公钥和数字签名组成的.其中,程序集的标识包 ...