介绍¶
更新记录
2023/5/14 增加该文章
2023/5/14 增加
Khronos组织章节2023/5/14 增加
OpenGL章节2023/5/14 增加
图形接口章节2023/5/14 增加
Vulkan章节2023/5/15 增加
计算机图形学章节2023/5/15 增加
实时渲染和离线渲染章节
计算机图形学¶
计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。(来源于 百度百科 ,说的不错)。
目前计算机中对于图形应用的开发一般有三种途径:
基于
GPU的硬实时渲染(一般简称实时渲染)基于
CPU的离线渲染基于
CPU的软实时渲染(一般简称软光栅)
每一种都有自己的特色和应用领域。
实时渲染和离线渲染¶
基于 GPU 的实时渲染,所谓 实时 目的是在尽可能短的时间里(一般小于1秒)对相应数据的输入,给出及时的反馈,其多为性能敏感。多见于游戏的画面渲染。而厂家为了用户使用自家显卡设备,都会推出设备对应的图形接口供用户访问使用。
基于 CPU 的离线渲染,多见于影视照片级别的光线追踪渲染中,像电影特效、逼真、震撼的影视场景一般都属于离线渲染。其多为计算密集型,计算一幅图像所需要的时间往往是巨大的(可能需要三天甚至更多时间渲染一幅图像)。
基于 CPU 的软光栅,多见于开发者学习 GPU 的实时渲染原理,并使用 CPU 来实现相关工作,优点是开发者可随心探索底层原理,缺点是性能堪忧,效果有限,不够灵活。多用于学习探索的目的,基本没有用此方法开发产品的。
实时、离线与光线追踪
随着设备的发展和性能的提升,不断有开发者尝试攻破离线渲染在 CPU 上渲染过于缓慢的问题,他们在努力尝试将 CPU 上的光追计算使用 GPU 进行计算,想要打破实时渲染和离线渲染之间的鸿沟。随着 DirectX 12 和 Vulkan 这样的
现代图形接口的发布,支持在 GPU 上进行实时光线追踪,实时渲染和离线渲染之间的鸿沟被彻底打破,实时渲染将在未来的大趋势下占有更加重要的一席。
图形接口¶
图形接口,也称图形 API ,其目的是定义一套规范用于与图形功能硬件设备进行沟通。由于市面上硬件设备产品众多,每一家都可以定义一套自己设备的图形接口,这就会导致设备使用用户需要每一个设备单独适配,其工作了繁重重复不稳定,
所以硬件设备生产商联合起来定一个统一的图形接口,使用此接口可以与任何支持该接口的设备进行沟通。当今天下有四套图形标准:
OpenGL:隶属于Khronos组织Vulkan:隶属于Khronos组织DirectX:隶属于微软Metal:隶属于苹果
Khronos组织¶
Khronos 原本指代的是古希腊神话传说中掌管时间的神祗 克罗诺斯 ,是俄耳甫斯教( Orphism )的原始神,此神祗经常与宙斯他爹 克洛诺斯 ( Kronos ) 搞混,因为发音基本没区别。
虽然克罗诺斯和克洛诺斯都属于古希腊神话体系,但不是同一派别(可能类似于道教中的全真和正一)。在俄耳甫斯教中克罗诺斯被称为宇宙第一因或宇宙的源头(类似道家中的道生一)。
扯远了。 Khronos组织 是一家非常著名的开源标准规范组织,像大家熟知的 OpenGL 、 OpenCL 、 SPIR 、 WebGL 还有 Vulkan 等等标准都是出自该组织。
OpenGL¶
作为跨平台跨设备的图形 API , OpenGL 应该算是元老级别的了, OpenGL 1.0 最早发布于 1992年1月,当时的图形接口只支持固定管线,并没有提供可编程的着色器特性,直到后来在 DirectX 中提供了可编程管线的功能,
OpenGL 在其逼迫下,于 2004年9月7日 发布了 OpenGL 2.0 支持可编程管线,并支持将片元着色器的输出结果输出到多个帧缓存( framebuffer )中。随着时代的发展和硬件设备能力的提升 OpenGL 也随之进步,截止本文创作, OpenGL 最新版本为
OpenGL 4.6 于 2017年7月31日 发布, OpenGL 是一种基于环境上下文( context )的架构,所谓环境上下文的意思是下一步的操作是基于上一步的内容继续的,比如此时拿一张白纸,上一步是将白纸涂满红色,下一步是中间画一个绿色矩形,当这个上下文执行结束
后你会得到一个在红色背景上绘制的绿色矩形画面。随着现在硬件设备的核心越来越多,多核心并行运算已成为常态,而这种基于环境上下文的架构不是并行友好(不支持多线程,虽然可以通过某些手段达到假的多线程效果), OpenGL 已经不满足于
现代硬件设备的胃口,而在 2015 年微软发布了现代图形 API : DirectX 12 , Khronos 组织也紧随其后在 2015 的 GDC ( Game Developers Conference,游戏开发者大会,简单理解就是世界各地大佬集会斗法 )上提了一嘴我们有开发下一代图形接口。
一开始称为 下一代OpenGL计划 ( next generation OpenGL initiative 或 glNext),但之后更改为 Vulkan 。新的跨平台,跨设备的现代开源图形接口就此诞生,并于 2016年2月16日 正式发布 Vulkan 1.0 版本。
本人也有幸于 2018 年开始研究 Vulkan 。
Vulkan¶
作为新一代的图形 API ,可以说完全重新设计了架构,摒弃了 OpenGL 的基于上下文的架构执行指令,而是使用基于 CommandBuffer 指令缓存推送到设备工作 Queue 队列的方式,进行指令执行。支持 OpenGL 不支持的多线程和硬件光线追踪。在 OpenGL 中对于函数的获取,
有的用 GLEW 有的用 GLAD 有的函数获取在某些平台甚至都是么棱两可的, Vulkan 中规避了该诟病,使用统一的接口获取所有接口函数。明确绘制结果如何呈现,而不是像 OpenGL 那样有默认的颜色、深度缓存。等等,可以说 Vulkan 和 OpenGL 是完全不一样的,
硬要说 Vulkan 与 OpenGL 之间是什么关系,可以说 Vulkan 是将 OpenGL 中的很多原本由驱动负责的任务,现在将其开放出来由 Vulkan 开发者自己管理,这也就是为什么很多人觉得 Vulkan 困难的原因,使用 Vulkan 开发总有一种开发 OpenGL 驱动的感觉,但好处是架构清晰,性能优良,完全可以基于 Vulkan 去
实现 OpenGL 的接口,反之则不行。要说 Vulkan 与 OpenGL 之间有什么相同点?确切说,除了图形学上统一的概念在 Vulkan 与 OpenGL 中是相同的(比如顶点属性,顶点着色器,片元着色器等等),其他没有任何相似的地方。读者完全
可以把 Vulkan 当做全新的架构去学,不需要提前学完 OpenGL ,当然如果提前了解了 OpenGL ,对于 Vulkan 中的一些概念是相通的,会对理解起一些帮助。但是读者放心,您在学习本教程时不需要会 OpenGL 也可以理解其中的奥妙。
Vulkan 与 DirectX 12
是同一级别的标准,都是现代图形接口标准。
有关学习 Vulkan
请注意,学习 Vulkan ,并不能像 OpenGL 那样简简单单三百行左右就能绘制一个简单三角形,而是基本上需要两千行左右才能使用 Vulkan 绘制出一个三角形,所以这里给急于学完 Vulkan 小伙伴提个醒,学习 Vulkan 必将是一个相对漫长的过程。
但也请放心,在学完此教程后区区两千行 Vulkan 只是洒洒水了,请给自己一点信心!!!