【OpenGL】环境建立之windows篇

微信号: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;
​

【OpenGL】环境建立之windows篇_第1张图片

 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);

 

你可能感兴趣的:(Opengl,shader,3D,数学)