OpenGL(6)调用系统API创建Local窗口
简介
为了将GPU绘制结果在窗口中显示出来,必然需要将OpenGL和具体窗口系统相结合。不同的操作系统,都有各自的绘制上下文创建、和设置当前绘制上下文的API。如下图所示,从应用程序到编写管线,最后得到具体窗口衍生出frame buffer,即可完成OpenGL应用程序的显示输出。
所有的OpenGL调用,都需要指定是在哪个上下文环境下调用的。不同的上下文中,同样的资源ID,可能对应于各自上下文中不同类型的资源。
因此,GL context的输出格式和Frame buffer的格式要一致才行,否则无法将GL context和frame buffer连接起来。比如,假如GL context将输出depth值,则frame buffer中应该包括depth buffer;假如GL context输出的颜色中的红色分量占8比特,则frame buffer中相应的color buffer的red分量也应该是8比特;假如GL context要求输出到back buffer中,则frame buffer就应该既包括front buffer,也包括back buffer。
Windows系统 窗口
在windows系统下创建OpenGL的窗口的一般流程如下。
- 调用函数CreateWindowEx创建窗口hWnd
- 调用函数GetDC得到hDC,其函数参数是hWnd
- 调用函数ChoosePixelFormat来查询hDC支持的所有像素格式,应用程序同时选择出其将采用哪种像素格式
- 调用函数SetPixelFormat设置hDC的像素格式
- 调用函数wglCreateContext创建hGLRC,其参数是hDC
- 调用函数wglMakeCurrent,其参数是hDC和hGLRC
- 调用glAPI函数绘制
小结:
粗略的,我们可以这样理解,第4步完成后将根据hDC衍生出frame buffer;第5步得到的hGLRC本质上是上图中的GL context;而第6步则将应用程序和GL context、GL context和frame buffer连接在一起。从第7步开始,所有的glAPI都将作用于和应用程序连接的GL context;而GL context的输出目的地则是和其连接的frame buffer。
其中,第5步的hDC和第6步的hDC并不需要是同一个值,只需要这两个hDC都设置了相同的像素格式即可,这样就可以保证GL context的输出格式和Frame buffer的格式的一致性。
Qt + GLAD/GLEW在windows系统下创建窗口
定义OpenGL Context
namespace MyGL
{
class GLContext
{
protected:
int _format;
HWND _hwnd;
HDC _hdc;
HGLRC _hrc;
public:
GLContext();
virtual ~GLContext();
HGLRC getRc() const;
bool setup(HWND hwnd, HDC hdc);
void shutdown();
void swapBuffer();
};
}
配合QWidget成功创建了窗口,如下图所示
Linux系统 X窗口
在Linux系统下创建OpenGL的X窗口的一般流程如下。
- 调用函数XOpenDisplay(NULL)得到display,可以将其认为是X server对显卡的一个抽象
- 查询display,确定其连接的screen
- 调用函数glxChooseFBConfig查询将在其上绘制的screen所支持的fbconfigs(本质上和windows中的像素格式是相同的),应用程序同时选择出其将采用哪种fbconfig
- 调用函数XCreateWindow创建窗口xWin,其参数包括fbconfig的部分内容
- 调用函数glXCreateWindow创建glxWin,参数是xWin和fbconfig
- 调用函数glXCreateNewContext创建glxCtx,参数是fbconfig
- 调用函数glxMakeContextCurrent,其参数包括glxWin和glxCtx。
- 调用glAPI函数绘制
实现过程另外起一篇写:OpenGL(7)调用系统API创建Ubuntu_X11窗口
Mac系统
木有钱买Mac,而且主攻 windows 和 linux。Mac 就暂时不搞
参考
https://blog.csdn.net/yjguo2004/article/details/4449487