实践解析 | 如何用 OpenGL 实现跨平台应用高效渲染

OpenGL(Open Graphics Library 开放式图形库)是一个定义了跨编程语言、跨平台的编程接口规格的专业图形程序接口。它可用于三维、二维图形图像的渲染,是一个功能强大,调用方便的底层图形库。在一个 RTC 应用中,因视频渲染或算法处理的需要,OpenGL 是一种高效的渲染或处理实现方式。OpenGL 的高效实现在 Windows、Linux 和 macOS 都有相应支持。此外,移动平台 iOS 和 Android 都能支持 OpenGL ES(OpenGL for Embedded Systems)。利用 OpenGL 进行跨平台的开发是非常方便的。本文就来分享一下如何利用 OpenGL 实现跨平台应用高效渲染。

因为各种硬件和软件的实现不同,OpenGL 在各平台支持的能力和规范也有差别。

移动平台支持的 OpenGL ES 是 OpenGL 三维图形 API 的一个子集,它是针对手机等嵌入式设备而设计。因此,需要兼容移动平台的跨平台开发时,尽量选择 OpenGL ES 支持的 API 。

OpenGL 和 OpenGL ES 的早期版本是针对固定管线的,从2.0开始支持着色语言(shading language)和可编程管线。可编程管线的 API使用更灵活,支持的特性更丰富。目前多数硬件都已经支持可编程管线,而且官方已经建议废弃固定管线 API 使用,在高版本中也移除了固定管线 API 。因此建议使用着色语言和可编程管线 API ,并至少支持2.0版本。如果要求支持的设备或系统都比较新,可以直接使用3.0或更高版本。

在应用程序调用任何 OpenGL 函数之前,都需要首先创建一个 OpenGL 上下文(Context)。这个 OpenGL 上下文可以理解为一个非常庞大的状态机,保存了 OpenGL 中的各种状态,这是 OpenGL 执行各种指令的基础。某种程度上,OpenGL 函数都是对其上下文这个状态机中对象或状态的操作。由于 OpenGL 上下文是一个巨大的状态机,切换上下文的开销往往比较大。不同的绘制模块又需要不同的状态和对象管理。因此在应用程序中可以创建多个不同的上下文,在不同线程中使用不同的上下文,上下文之间可以共享缓冲区,纹理等资源。应当尽量避免反复切换上下文和修改大量状态,提高处理效率。

虽然 OpenGL 是跨平台的,但各平台的实现和 OpenGL 的环境搭建会有所不同。开发过程中各平台的 OpenGL 上下文(Context)的建立和切换都有所不同。开发者既可以使用如 GLFW、GLUT 等开源框架帮助完成 OpenGL上下文环境的建立和管理,也可以使用各平台的原生 API 来完成。本文主要介绍使用各平台原生 API 的方法。下面分平台介绍各平台的 OpenGL 环境建立与上下文创建。

一、Windows

Windows 平台由于微软的 Direct3D 存在,微软对 OpenGL 的支持并不积极。在大多数微软操作系统中所支持 OpenGL 版本还是 1.0 和 1.1 ,仅支持固定管线 API ,对于现代使用 OpenGL 开发的程序并不友好。不过通过 OpenGL 的 ARB 扩展机制可以让我们访问到 OpenGL 的高级特性接口。Windows OpenGL 实现提供了名为 wglGetProcAddress 的函数,允许我们对指向一个由驱动程序提供的 OpenGL 函数的指针进行检索。不过还有一种更为快捷的方法。通过 GLEW(GL Extension Wrangler)库完成这一繁琐的检索过程。只需要引入头文件 glew.h 和 glew 库并在应用程序的开始调用 glewInit(),之后 OpenGL 1.1 以上的扩展和核心特性的所有函数指针都将自动被设置完成。

glewInit 的调用需要先创建一个 OpenGL 上下文环境,在初始化完成后,再删除这个环境。之后重新创建一个支持 WGL_ARB 扩展的 OpenGL 上下文环境。示例代码如下:

/* 注册窗口类 /
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.hInstance = GetModuleHandle(NULL);
wcex.lpfnWndProc = GLEW_WindowProc;
wcex.lpszClassName = kszGlewInitClassName;
/
创建窗口以初始化glew /
HWND hwnd = CreateWindow(kszGlewInitClassName,L"", (WS_POPUP | WS_DISABLED), CW_USEDEFAULT, CW_USEDEFAULT, 10, 10,NULL, NULL, GetModuleHandle(NULL), NULL);
/
设置像素格式 /
HDC

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值