介绍

更新记录
  • 2023/5/14 增加该文章

  • 2023/5/14 增加 Khronos组织 章节

  • 2023/5/14 增加 OpenGL 章节

  • 2023/5/14 增加 图形接口 章节

  • 2023/5/14 增加 Vulkan 章节

  • 2023/5/15 增加 计算机图形学 章节

  • 2023/5/15 增加 实时渲染和离线渲染 章节

计算机图形学

计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。(来源于 百度百科 ,说的不错)。

目前计算机中对于图形应用的开发一般有三种途径:

  1. 基于 GPU 的硬实时渲染(一般简称 实时渲染

  2. 基于 CPU离线渲染

  3. 基于 CPU 的软实时渲染(一般简称 软光栅

每一种都有自己的特色和应用领域。

实时渲染和离线渲染

基于 GPU 的实时渲染,所谓 实时 目的是在尽可能短的时间里(一般小于1秒)对相应数据的输入,给出及时的反馈,其多为性能敏感。多见于游戏的画面渲染。而厂家为了用户使用自家显卡设备,都会推出设备对应的图形接口供用户访问使用。

基于 CPU 的离线渲染,多见于影视照片级别的光线追踪渲染中,像电影特效、逼真、震撼的影视场景一般都属于离线渲染。其多为计算密集型,计算一幅图像所需要的时间往往是巨大的(可能需要三天甚至更多时间渲染一幅图像)。

基于 CPU 的软光栅,多见于开发者学习 GPU 的实时渲染原理,并使用 CPU 来实现相关工作,优点是开发者可随心探索底层原理,缺点是性能堪忧,效果有限,不够灵活。多用于学习探索的目的,基本没有用此方法开发产品的。

实时、离线与光线追踪

随着设备的发展和性能的提升,不断有开发者尝试攻破离线渲染在 CPU 上渲染过于缓慢的问题,他们在努力尝试将 CPU 上的光追计算使用 GPU 进行计算,想要打破实时渲染和离线渲染之间的鸿沟。随着 DirectX 12Vulkan 这样的 现代图形接口的发布,支持在 GPU 上进行实时光线追踪,实时渲染和离线渲染之间的鸿沟被彻底打破,实时渲染将在未来的大趋势下占有更加重要的一席。

图形接口

图形接口,也称图形 API ,其目的是定义一套规范用于与图形功能硬件设备进行沟通。由于市面上硬件设备产品众多每一家都可以定义一套自己设备的图形接口,这就会导致设备使用用户需要每一个设备单独适配,其工作了繁重重复不稳定, 所以硬件设备生产商联合起来定一个统一的图形接口,使用此接口可以与任何支持该接口的设备进行沟通。当今天下有四套图形标准:

  1. OpenGL :隶属于 Khronos 组织

  2. Vulkan :隶属于 Khronos 组织

  3. DirectX :隶属于微软

  4. Metal :隶属于苹果

Khronos组织

Khronos 原本指代的是古希腊神话传说中掌管时间的神祗 克罗诺斯 ,是俄耳甫斯教( Orphism )的原始神,此神祗经常与宙斯他爹 克洛诺斯 ( Kronos ) 搞混,因为发音基本没区别。 虽然克罗诺斯和克洛诺斯都属于古希腊神话体系,但不是同一派别(可能类似于道教中的全真和正一)。在俄耳甫斯教中克罗诺斯被称为宇宙第一因或宇宙的源头(类似道家中的道生一)。

扯远了。 Khronos组织 是一家非常著名的开源标准规范组织,像大家熟知的 OpenGLOpenCLOpenGLWebGL 还有 Vulkan 标准都是出自该组织。

OpenGL

作为跨平台跨设备的图形 APIOpenGL 应该算是元老级别的了, OpenGL 1.0 最早发布于 1992年1月,当时的图形接口只支持固定管线,并没有提供可编程的着色器特性,直到后来在 DirectX 中提供了可编程管线的功能, OpenGL 在其逼迫下,于 2004年9月7日 发布了 OpenGL 2.0 支持可编程管线,并支持将片元着色器的输出结果输出到多个帧缓存( framebuffer )中。随着时代的发展和硬件设备能力的提升 OpenGL 也随之进步,截止本文创作, OpenGL 最新版本为 OpenGL 4.62017年7月31日 发布, OpenGL 是一种基于环境上下文( context )的架构,所谓环境上下文的意思是下一步的操作是基于上一步的内容继续的,比如此时拿一张白纸,上一步是将白纸涂满红色,下一步是中间画一个绿色矩形,当这个上下文执行结束 后你会得到一个在红色背景上绘制的绿色矩形画面。随着现在硬件设备的核心越来越多,多核心并行运算已成为常态,而这种基于环境上下文的架构不是并行友好(不支持多线程,虽然可以通过某些手段达到假的多线程效果), OpenGL 已经不满足于 现代硬件设备的胃口,而在 2015 年微软发布了现代图形 API : DirectX 12Khronos 组织也紧随其后在 2015GDCGame Developers Conference,游戏开发者大会,简单理解就是世界各地大佬集会斗法 )上提了一嘴我们有开发下一代图形接口。 一开始称为 下一代OpenGL计划next generation OpenGL initiativeglNext),但之后更改为 Vulkan 。新的跨平台,跨设备的现代开源图形接口就此诞生,并于 2016年2月16日 正式发布 Vulkan 1.0 版本。 本人也有幸于 2018 年开始研究 Vulkan

Vulkan

作为新一代的图形 API ,可以说完全重新设计了架构,摒弃了 OpenGL 的基于上下文的架构执行指令,而是使用基于 CommandBuffer 指令缓存推送到设备工作 Queue 队列的方式,进行指令执行。支持 OpenGL 不支持的多线程和硬件光线追踪。在 OpenGL 中对于函数的获取, 有的用 GLEW 有的用 GLAD 有的函数获取在某些平台甚至都是么棱两可的, Vulkan 中规避了该诟病,使用统一的接口获取所有接口函数。明确绘制结果如何呈现,而不是像 OpenGL 那样有默认的颜色、深度缓存。等等,可以说 VulkanOpenGL 是完全不一样的, 硬要说 VulkanOpenGL 之间是什么关系,可以说 Vulkan 是将 OpenGL 中的很多原本由驱动负责的任务,现在将其开放出来由 Vulkan 开发者自己管理,这也就是为什么很多人觉得 Vulkan 困难的原因,使用 Vulkan 开发总有一种开发 OpenGL 驱动的感觉,但好处是架构清晰,性能优良,完全可以基于 Vulkan 去 实现 OpenGL 的接口,反之则不行。要说 VulkanOpenGL 之间有什么相同点?确切说,除了图新学上统一的概念在 VulkanOpenGL 中是相同的(比如顶点属性,顶点着色器,片元着色器等等),其他没有任何相似的地方。读者完全 可以把 Vulkan 当做全新的架构去学,不需要提前学完 OpenGL ,当然如果提前了解了 OpenGL ,对于 Vulkan 中的一些概念是相通的,会对理解起一些帮助。但是读者放心,您在学习本教程时不需要会 OpenGL 也可以理解其中的奥妙。

VulkanDirectX 12

是同一级别的标准,都是现代图形接口标准。

有关学习 Vulkan

请注意,学习 Vulkan ,并不能像 OpenGL 那样简简单单三百行左右就能绘制一个简单三角形,而是基本上需要两千行左右才能使用 Vulkan 绘制出一个三角形,所以这里给急于学完 Vulkan 小伙伴提个醒,学习 Vulkan 必将是一个相对漫长的过程。 但也请放心,在学完此教程后区区两千行 Vulkan 只是洒洒水了,请给自己一点信心!!!