不用这么急着切换,得等到5年后,再来看 Vulkan 的生态。不要觉得 OpenGL、OpenGL ES 没落了,会被 Vulkan 取代,两者会在相当长的时间里共存。工作之余,可以抽时间学习 Vulkan。
图形学有很多API,起初两大阵营是 DirectX 和 OpenGL,Mantle、Metal、Vulkan 是后来者。OpenGL 当时声称是跨平台的图形学API,却在移动平台上裁剪搞出 OpenGL ES(ES是Embeded Systems的缩写)。没办法,当时手机硬件水平确实不咋地,催生了各种纹理压缩格式(ATC、PVRT、ETC等)。现如今移动平台硬件性能强悍起来了,统一的 API 又浮出水面了。AMD 捐献出铺路的 Mantle,成了后来的 Vulkan。好了,现在没有什么 Vulkan ES 了,世界大统一了吗?没有,由于 Apple 自家软硬一体,不亲近你 OpenGL 和 Vulkan。为了让 Vulkan 在尽可能多的平台上运行(比如苹果 macOS / iOS),Khronos Group 于2020年9月21日推出 Vulkan 的可移植性扩展(VK_KHR_portability_subset)的 1.0 正式版本[1]。VK_KHR_portability_subset extension 使得可以在不支持 Vulkan 的 Apple 操作系统平台上运行,但必须驻留在 Apple 的 Mental API 之上。
为什么大统一统一不起来呢?硬件参差不齐所致。做游戏开发,要尝试兼容到最低配置的硬件上,让更多的玩家得到体验。随着硬件的不断发展,性能得以改善,可以逐渐抛弃那些低端设备了。现在 OpenGL ES 2.0属于手机低配了,个人观点是等普及了OpenGL ES 3.0,就可以上 Vulkan了。我们来看看官方于2020年8月30日统计收集的 OpenGL 和 Vulkan 数据,我们看到,近一半的设备还不支持 Vulkan。
Vulkan 相对 OpenGL 而言,是较底层的API,能够释放更多的硬件性能。Vulkan 版的 Hello World 程序,也就是图形学里的画三角形,需要好六百多行的代码。对于零基础学习的,会很吃力,一上来好多概念需要先理解。但如果熟悉 OpenGL 在先,会好些。转换代码也要注意一些变化。Vulkan 定义了新的坐标系,Y轴朝下,不像其他的,都是Y轴朝上。好处是纹理坐标不需要上下翻转图片了。OpenGL支持的 provoking vertex 可以是第一个顶点,也可以是最后一个顶点,Vulkan只能是第一个顶点,这在平坦着色(flat shadding)时可能出问题。这是一些代码从 OpenGL 转换到 Vulkan 的时候要注意的地方。
很多软件和引擎,开始朝 Vulkan 迁移了。学起来吧~
下面的 GitHub 工程支持 Windows / Linux / Android / iOS / macOS 等平台,支持 HLSL 和 GLSL shader 语言,有介绍 descriptor set 和 push constant 等这些新术语的例子,很适合学习。