介绍¶
更新记录
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
只是洒洒水了,请给自己一点信心!!!