Real-Time Rendering 4th 第二章2

本文详细介绍了图形渲染的各个阶段,特别是应用程序阶段和几何处理阶段。在应用程序阶段,开发人员可以完全控制并优化算法以提高性能,而计算着色器使GPU能执行通用计算任务。几何处理阶段涉及顶点着色、投影和裁剪等,其中顶点着色不仅计算位置,还处理光照和材质效果。投影和裁剪操作将三维模型转换为二维图像,为后续的渲染步骤做准备。
摘要由CSDN通过智能技术生成

2.2应用阶段

开发人员可以完完全全地控制应用程序阶段发生的事情,因为它通常在CPU上执行。因此,开发人员可以完全决定实现方法并且还可以在之后修改它去提高性能。针对这里的变化也会影响下一个阶段的性能,例如,应用程序阶段的算法或是环境设置也许会减少需要渲染的三角形数量。

所以说,一些应用程序的任务可以使用一种被称为计算着色器的单独模型在GPU上执行,这种模式将GPU看做一个高度并行的通用处理器,忽略了它专门用于渲染图形的特殊功能。

在应用程序阶段的末尾,要被渲染的几何图形被输入到几何处理阶段。这些渲染图元(点、线、三角形)最终呈现在屏幕上(或你所使用的输出设备)。这是应用程序阶段最重要的任务。

这个阶段的基于软件的实现的一个结果是,它没有被划分为子阶段,如几何处理阶段、光栅化阶段和片段处理阶段。然而,为了提高性能这些阶段通常分为几个核心并行执行。在CPU设计中,这个被称为超标量结构,因为它能够执行几个过程在同一个阶段的同一时间。章节18.5介绍了多种使用多处理核心的方法。

碰撞检测通常在这个阶段实现,在检测到两个物体发生碰撞后,会生成响应并将其发送回碰撞的物体与力反馈设备。应用处理阶段同样是处理其他来源的输入的地方,例如:键盘、鼠标或是头戴式显示器。依靠这些输入,可能会采取几种不同的操作。加速算法例如特殊的剔除算法以及管道的其他无法处理的部分也是在这个阶段实现。

2.3 几何处理

在GPU上的几何处理阶段负责每个三角形和顶点的大部分操作。这个阶段进一步的划分为以下功能子阶段:顶点着色、投影、裁剪以及屏幕映射。

图2.3 几何处理阶段划分为一个功能阶段的管道

2.3.1 顶点着色

顶点着色有两个主要任务,一是计算顶点的位置和二是评估任何程序员可能想拥有的东西作为顶点输出数据,例如法线和纹理坐标。传统上,很多对象的着色是将光源应用于顶点的位置和法线去计算并保存顶点的颜色。这些颜色在之后会被插值到三角形的每一个点。因此,这些可编程的顶点处理单元被叫做顶点着色器。随着现代GPU的出现,一些甚至所有着色发生在每个像素上,因此顶点着色阶段变得更加普通并且不会再去计算任何着色方程,当然最终做法取决于程序员的想法。现在顶点着色器更多的是专注于给每个顶点设置相关数据的一个单元。举个例子,顶点着色器可以使用4.4和4.5的方法对对象进行动画处理。

我们首先描述如何计算顶点位置,这是一组我们无论如何都需要的坐标。在到达屏幕的过程中,模型会经过一系列不同的空间或坐标系变换,最开始模型是在它们自己的模型空间内,可以简单的理解成还没有被变换过的时候。每个模型都有一个相对应的模型变换矩阵,用于调整位置和方向。单个模型也可能有多个模型变换,因此,在同一个场景中的一个模型允许有多个副本(也叫做实例)有不同的位置、方向和大小,并且不需要复制基本几何图形。

通过模型变换变换的是模型的顶点和法线,物体的坐标系被叫做模型坐标。经过模型变换,就可以说模型位于世界坐标或世界空间内了。世界空间是独一无二的,模型通过他们各自的模型变换矩阵变换后所有的模型都处于同一个空间内。

正如之前所说的那样,只有在摄像机(或玩家)的视野内的物体才会被渲染。摄像机在世界空间内有一个位置和朝向,位置用于描述摄像机所在地方、朝向用于描述摄像机的目标。为了方便之后的投影和裁剪,摄像机和所有的模型都会进行视图变换,视图变换的目的是将摄像机放在原点并将其对准目标,使得摄像机的朝向为负z轴的方向,y轴朝上,x轴指向右边,我们约定使用-z轴,但有些文章偏向使用+z轴,区别主要是语义上的,因为两者之间的变换非常简单。在经过视图变换之后的实际位置和朝向取决于底层应用API接口。因此,这个空间被叫做摄像机空间或者更常用的视图空间、视空间。一个视图变换影响摄像机和模型的例子如图2.4所示,模型变换和视图变换都可以用一个4×4的矩阵实现,不过这是章节4的内容。然而,明白程序员用什么方法计算出一个顶点的位置和法线是非常重要的。

图2.4 在左图的俯视图显示的z轴朝上的世界中,用户自定义的相机。视图变换重定向世界,是的摄像机位于原点,看向-z轴方向,并且y轴朝上,正如右图所示。这样可以使得裁剪和投影操作变得更加简单和快捷。浅蓝色的区域就是视景体,在这里用的是透视投影的方式,因此这个视景体是一个平截头体(视椎体),任何类型的投影都是用的相似的技术。

接下来,我们讲述顶点着色的第二种输出类型,为了显示出一个真实的场景,只渲染物体的性质和位置是远远不够的,它们的外观也必须和模型一模一样,包括物体的材质以及其他任何光源对物体的效果。材质和灯光可以用多种方法进行数学建模,包括从简单的颜色到物理描述的详细表示。

这种确定光照在某种材质上产生的效果的过程被称为着色。包括计算物体上各种不同的点的着色方程,通常来说,有些模型的顶点计算在几何处理过程执行,剩下的在片元处理阶段执行。每个顶点都加载了大量材质的数据,例如顶点的位置、法线、颜色或是任何可以用数据表示的并且在计算着色方程式需要的数据。顶点着色的结果(可能是颜色、向量、纹理坐标以及其他有关着色的数据类型)被发送到片元处理阶段和光栅化阶段,然后通过插值的方式用于计算表面的着色。

GPU顶点着色器形式的顶点着色更深入的讨论大多在章节3和章节5。

作为顶点着色的一部分,渲染系统先执行投影操作然后在执行裁剪操作。这会将视椎体变换成一个单位立方体,该单位立方体的范围从(-1,-1-1)到(1,1,1)。我们可以用不同的范围来定义同一个体积,例如0<z<1。这个单位立方体被叫做标准视景体。在GPU的顶点着色器执行完之后,首先执行的是投影操作。有两种被普遍使用的投影方法,分别是正交投影(也叫做平行投影)和透视投影,如图2.5所示。事实上,正交投影只是平行投影其中一种。还有一些在建筑领域会用到,如斜投影和轴测投影。游戏Zaxxon的命名来自后者。

图2.5 左图是正交或平行投影,右图是透视投影

英文投影用矩阵来表示所以它有时候会与几何变换的其余部分联系起来。

正交投影的视景体通常是一个长方体的盒子,正交投影变换会将这个视景体变成一个单位立方体。正交投影主要特点就是投影前的平行线在变换后任然保持平行。平行投影变换是平移变换和缩放变换的结合。

透视投影则更加复杂一些。在透视投影中,距离摄像机更远处的物体在变换后会变得更小。并且平行线在投影后可能会在地平线相交。所以透视投影实际是模仿我们所观察的物体大小。几何学上,视景体称为视椎体,一个被截取了顶部的矩形基底,透视投影之后,视椎体同样会被变换成一个单位立方体。正交投影和透视投影都是用一个4×4的矩阵实现,在经过投影变换之后,模型所在坐标被叫做裁剪坐标,我们会在章节4中讨论它。因此我们可以知道它发生在用w做除法之前。为了下一个函数阶段----裁剪,能正确的工作,GPU的顶点着色器必须输出这种形式的坐标。

虽然这些矩阵只是将一个几何体变换成另一个几何体,但是它们依然被叫做投影,因为在显示之后,z坐标不会加载在生成的图像上,而是被存储在z缓冲中,在章节2.5中会详细讨论。这样下来,模型坐标就从三维投影到二维了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值