微信号:ITComputerGraph
更多精彩内容,关注公众号《IT木子李》
OpenGL是一种跨平台的三维图形API,它是图形硬件(GPU)的一种软件接口。熟悉它的应该还知道OpenGL是一个大的状态机。OpenGL的代码主要是GPU代码,运行速率相当高效。
推荐几个相关常用库:GLEW / GLFW / GLUT / GLM
GLEW是一个维护OpenGL扩展的开源库,里面定义了相交的API。
GLFW / GLUT是跨平台建立窗口的开源库,由于不同平台的相关性,导致建立窗口是个比较麻烦的事情,这里有大牛封装好了,拿去用吧。
GLM是一个OpenGL相关的数学库,你想的函数基本上都有,拿走不谢。
这里还要推荐一个GUI框架QT,也是跨平台开原的哦,博主用的最多,拿走不谢。
介绍完相关常用库了,来说一下今天的主题,OpenGL的环境建立。
当我们用GLFW / GLUT建立窗口的时候,它已经为我们建立好了当前使用操作系统的OpenGL环境,那自己还搞什么OpenGL环境,用就完了呗,相信肯定会有人提出这样的问题。叮叮叮!!!敲黑板了,做为一个底层开发,这都不会还想拿高薪?还有一个原因,有些时候这些环境并不是我们想要的,我们要自定义一些相关设置。
选择一个象素格式 ChoosePixelFormat
设置OpenGL象素格式 SetPixelFormat
创建OpenGL上下文 wglCreateContext
绑定OpenGL上下文到当前窗口 wglMakeCurrent
交换缓冲区 SwapBuffers
好枯燥,累吐了!!!
先来说一下象素格式,大家都知道图像是由红、绿、蓝三色组成,我们可以为窗口设置每个颜色通道所占的比特位数等相关信息。
windows系统为我们提供了一个描述象素格式的结构:
PIXELFORMATDESCRIPTOR
typedef struct tagPIXELFORMATDESCRIPTOR
{
WORD nSize;结构大小
WORD nVersion;结构版
DWORD dwFlags;像素缓冲区属性
BYTE iPixelType;像素数据类型RGBA或其它
BYTE cColorBits;缓冲区中颜色平面的数量
BYTE cRedBits;红色位数
BYTE cRedShift;红色位的移位计数
BYTE cGreenBits;绿色位数
BYTE cGreenShift;绿色位的移位计数
BYTE cBlueBits;蓝色位数
BYTE cBlueShift;蓝色位的移位计数
BYTE cAlphaBits;透明色位数
BYTE cAlphaShift;透明色位的移位计数
BYTE cAccumBits;累计缓冲区位数
BYTE cAccumRedBits;累计缓冲红色区位数
BYTE cAccumGreenBits;累计缓冲区绿色位数
BYTE cAccumBlueBits;累计缓冲区蓝色位数
BYTE cAccumAlphaBits;累计缓冲区透明色位数
BYTE cDepthBits;深度位数
BYTE cStencilBits;模版位数
BYTE cAuxBuffers;辅助缓冲个数
BYTE iLayerType;过时了,不管
BYTE bReserved;
DWORD dwLayerMask;
DWORD dwVisibleMask;
DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, FAR *LPPIXELFORMATDESCRIPTOR;
windows系统每个窗口都有对应的句柄和DC
传入窗口dc和象素格式,返回一个我们要使用的象素格式
pixelFormat = ChoosePixelFormat(_hdc, &pfd);
设置象素格式
SetPixelFormat(_hdc, pixelFormat, &pfd)
创建opengl上下文
rc = wglCreateContext(_hdc);
至此OpenGL环境算是建立好了,如何使用了
wglMakeCurrent(_hdc, rc); 把rc绑定当前窗口的dc,完美了
再说一下SwapBuffers,显示器投射光子到屏幕,信号是由GPU发送的,GPU每计算好一个象素,就会发送出来,显示器接到信号投射到屏幕,想象一下会出现什么情况,有的象素计算快,马上就出来了,有的慢,等会再出来,这样就会出现图像不完整、闪烁的情况,所以有一个新办法,就是每次绘制到一张图片上,等图片完整了,再推送给显示器。
SwapBuffers(_hdc);