OpenGL(6)调用系统API创建Local窗口

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的窗口的一般流程如下。

  1. 调用函数CreateWindowEx创建窗口hWnd
  2. 调用函数GetDC得到hDC,其函数参数是hWnd
  3. 调用函数ChoosePixelFormat来查询hDC支持的所有像素格式,应用程序同时选择出其将采用哪种像素格式
  4. 调用函数SetPixelFormat设置hDC的像素格式
  5. 调用函数wglCreateContext创建hGLRC,其参数是hDC
  6. 调用函数wglMakeCurrent,其参数是hDC和hGLRC
  7. 调用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系统下创建窗口

GLAD/GLEW/GLFW/等之间的关系

定义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窗口的一般流程如下。

  1. 调用函数XOpenDisplay(NULL)得到display,可以将其认为是X server对显卡的一个抽象
  2. 查询display,确定其连接的screen
  3. 调用函数glxChooseFBConfig查询将在其上绘制的screen所支持的fbconfigs(本质上和windows中的像素格式是相同的),应用程序同时选择出其将采用哪种fbconfig
  4. 调用函数XCreateWindow创建窗口xWin,其参数包括fbconfig的部分内容
  5. 调用函数glXCreateWindow创建glxWin,参数是xWin和fbconfig
  6. 调用函数glXCreateNewContext创建glxCtx,参数是fbconfig
  7. 调用函数glxMakeContextCurrent,其参数包括glxWin和glxCtx。
  8. 调用glAPI函数绘制

实现过程另外起一篇写:OpenGL(7)调用系统API创建Ubuntu_X11窗口

Mac系统

木有钱买Mac,而且主攻 windows 和 linux。Mac 就暂时不搞

参考

https://blog.csdn.net/yjguo2004/article/details/4449487

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值