天天动画片 > 八卦谈 > 实时渲染基础知识

实时渲染基础知识

八卦谈 佚名 2023-06-06 12:26:50

2.1 渲染管线

图形渲染管线是实时渲染的核心组件。渲染管线的功能是通过给定虚拟相机、3D场景物体以及光源等场景要素来产生或者渲染一副2D的图像。渲染管线是实时渲染的重要工具,实时渲染离不开渲染管线。图形渲染管线主要包括两个功能:一是将物体3D坐标转变为屏幕空间2D坐标,二是为屏幕每个像素点进行着色。渲染管线的一般流程如下图所示。分别是:顶点数据的输入、顶点着色器、曲面细分过程、几何着色器、图元组装、裁剪剔除、光栅化、片段着色器以及混合测试。我们会在后文对管线的各个阶段进行详细的介绍。

渲染管线的一个特点就是每个阶段都会把前一个阶段的输出作为该阶段的输入。例如,片段着色器会将光栅化后的片段(以及片段的数据块)作为输入进行光照计算。除了图元组装和光栅化几个阶段是由硬件自动完成之外,管线的其他阶段管线都是可编程/可配置的。其中顶点着色器、曲面细分相关着色器、几何着色器和片段着色器是可编程的阶段,而混合测试是可高度配置的阶段。管线的可编程/可配置是渲染管理的另一个特点。因为早期的渲染管线采用的是立即渲染模式(Immediate mode,也就是固定渲染管线),不允许开发人员改变GPU渲染的方式,而核心渲染默认(Core-profile mode)允许开发人员定制化GPU的渲染方式。

2.1.1 传统渲染管线

CPU和GPU

渲染的工作阶段:应用阶段(CPU),几何阶段(GPU),光栅化阶段(GPU)。

CPU的工作

l  应用阶段

1.         从硬盘中加载数据到内存

2.         把数据加载到显存VRAM,数据包括顶点位置,法线方向,顶点颜色,纹理坐标等。

3.         设置渲染状态,用于指导GPU的渲染工作

4.         调用Draw Call,一个渲染命令,由CPU生成发送给GPU。


因此对于Draw Call的性能问题是CPU造成的,不是GPU。

注:如何减少Draw Call命令:批处理合并Draw Call,减少CPU的提交Draw Call命名次数。

GPU渲染流水线

GPU渲染流水线。红色表示完全可编程控制,黄色表示可以配置但不可编程,白色表示由GPU硬件固定实现,开发者无控制权。实线表示必须由开发者来实现,虚线表示可由开发者选择实现


GPU渲染流水线如上图所示,我们接下来简单介绍GPU渲染流水线各个阶段的功能:

顶点数据:顶点数据用来为后面的顶点着色器等阶段提供处理的数据。是渲染管线的数据主要来源。送入到渲染管线的数据包括顶点坐标、纹理坐标、顶点法线和顶点颜色等顶点属性。为了让OpenGL明白顶点数据构成的是什么图元,我们需要在绘制指令中传递相对应的图元信息。常见的图元包括:点(GL_POINTS)、线(GL_LINES)、线条(GL_LINE_STRIP)、三角面(GL_TRIANGLES)。

l  几何阶段

1.         顶点着色器:顶点着色器主要功能是进行坐标变换。进行的是逐顶点操作。将输入的顶点坐标变换到世界空间、观察空间和裁剪空间等。虽然我们也会在顶点着色器进行光照计算(称作高洛德着色),然后经过光栅化插值得到各个片段的颜色,但由于这种方法得到的光照比较不自然,所以一般在片段着色器进行光照计算。

2.         曲面细分着色器:可选编程的着色器。用于细分图元。图元一般使用三角形。曲面细分是利用镶嵌化处理技术对三角面进行细分,以此来增加物体表面的三角面的数量,是渲染管线一个可选的阶段。它由外壳着色器(Hull Shader)、镶嵌器(Tessellator)和域着色器(Domain Shader)构成,其中外壳着色器和域着色器是可编程的,而镶嵌器是有硬件管理的。我们可以借助曲面细分的技术实现细节层次(LOD)的机制,使得离摄像机越近的物体具有更加丰富的细节,而远离摄像机的物体具有较少的细节。



3.         几何着色器:可选编程的着色器。用于逐图元的操作,以及产生更多的图元,例如粒子模拟,烟花等的就是在这个阶段实现。几何着色器也是渲染管线一个可选的阶段。我们知道,顶点着色器的输入是单个顶点(以及属性), 输出的是经过变换后的顶点。与顶点着色器不同,几何着色器的输入是完整的图元(比如,点),输出可以是一个或多个其他的图元(比如,三角面),或者不输出任何的图元。几何着色器的拿手好戏就是将输入的点或线扩展成多边形。下图展示了几何着色器如何将点扩展成多边形。


4.         裁剪:由于摄像机的视野有限,不在摄像机视野范围内的物体不需要渲染,裁剪就是裁剪出摄像机的视野部分。


5.         屏幕映射:将摄像机实时检测到的画面映射到摄像机的成像屏幕上。

 

l  光栅化阶段


1.         三角形设置:根据三角形的顶点找到三角形的边

2.         三角形遍历:使用像素块填充三角形,一般会用到插值。

3.         片元着色器:其主要工作有纹理采样,模板测试(Stencil),深度测试(Depth),和像素颜色混合(Blend)等。逐像素的计算每个像素的颜色。片段着色器用来决定屏幕上像素的最终颜色。在这个阶段会进行光照计算以及阴影处理,是渲染管线高级效果产生的地方。

4.         测试混合阶段:管线的最后一个阶段是测试混合阶段。测试包括裁切测试、Alpha测试、模板测试和深度测试。没有经过测试的片段会被丢弃,不需要进行混合阶段;经过测试的片段会进入混合阶段。Alpha混合可以根据片段的alpha值进行混合,用来产生半透明的效果。Alpha表示的是物体的不透明度,因此alpha=1表示完全不透明,alpha=0表示完全透明。测试混合阶段虽然不是可编程阶段,但是我们可以通过OpenGL或DirectX提供的接口进行配置,定制混合和测试的方式。

 

l  补充知识

1.         屏幕后处理:将计算机渲染场景后相机生成的结果图像使用图像处理技术进一步处理得到我们想要的结果。

2.         模板测试:用于限制渲染的区域

3.         深度测试与深度写入:用于判断片元的可见性,可实现某些透明效果。


4.         颜色混合操作


5.         透视除法

执行透射除法后(除以w分量),我们可以得到标准设备空间,该空间一般也称作标准视体(Canonical View Volume,CVV)。执行透视除法是为了实现透射投影中近大远小的视觉效果,经过了投影矩阵Projection的变换后,W分量保留了观察空间中物体Z坐标的信息,所以透视除法才能够根据距离摄像机的远近正确实现透视效果。我们注意到透射除法是由硬件自动执行的,也就是说透视除法在正交投影和透视投影中都会被执行,只不过正交投影变换并没有改变W分量的值(W分量的值仍是1),所以透视除法并没有实际的效果。


2.1.2 DXR光线追踪渲染管线


l  射线生成着色器(Ray Generation Shader):光线生成程序,它将作为光线追踪的起点,并针对每个像素进行调用:它通常将初始化一个光线描述符RayDesc,该光线描述符从照相机的位置开始,并通过评估像素位置处的照相机镜头模型所给出的方向。然后它将调用TraceRay(),将在场景中发出光线。下面的其他着色器将处理更多事件,并将其结果通过射线有效负载返回给射线生成着色器。

l  错过着色器(Miss Shader):当光线不与任何几何图形相交时,将执行错过着色器。它通常可以对环境贴图进行采样,或者通过射线有效载荷返回简单的颜色。

l  最接近的命中着色器(Closest Hit Shader):在命中最接近射线起点的几何实例时,将调用最接近的命中着色器。例如,此着色器可以执行照明计算,并通过光线有效负载返回结果。按照基于光栅化的应用程序根据对象具有多个像素着色器的精神,可以根据需要提供尽可能多的最接近的命中着色器。

 

我们可以通过调用DXR的API使用该渲染管道,但是需要光追显卡的硬件支持。

附:官方教程:https://developer.nvidia.com/rtx/raytracing/dxr/dx12-raytracing-tutorial-part-1

2.1.3 对比与总结

l  传统渲染管线:从相机的可见物体顶点出发,一步步矩阵变换到屏幕空间,然后光栅化为像素,并为其计算颜色。

l  光线追踪渲染管线:从相机到屏幕像素发出射线,经过物体表面的镜面反射、折射或漫反射等(BRDF——材质),最终到达光源。我们计算射线与场景物体的所有交点处的辐射度,最终混合为屏幕像素的颜色值。

2.2 坐标空间

齐次坐标

齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。在3维空间中,由于3x3矩阵不能表示顶点的平移操作,齐次坐标的引入可以解决该问题。对于三维空间中的点,将其三维坐标转换成齐次坐标即把其w分量设为1;对于三维空间中的方向向量,则需要把其w分量设为0,因为方向向量的平移是没有意义的。

下面简单回顾如何使用4x4矩阵来表示平移、旋转和缩放。


常用坐标空间及其变换

从三维场景中的模型坐标经过一系列坐标空间变换最终到达相机的成像屏幕,流程示意图如下。

 

l  模型空间

也叫对象空间或局部空间。模型空间的原点和坐标轴由美术人员在建模软件中事先设置好的,一般使用左手坐标系。

l  世界空间

世界空间可以用于描述物体绝对位置,一般使用左手坐标系。

模型空间坐标到世界空间坐标的变换有一种较为简单的思路,即将模型空间坐标轴进行一系列平移、旋转和缩放使得模型空间原点和坐标轴与世界空间原点和坐标轴重合,这样得到的变换矩阵即可将模型空间坐标变换到世界空间坐标。

l  观察空间

也叫相机空间。一般以相机位置为原点,+x指向右方,+y指向上方,-z轴指向相机的朝向,使用右手坐标系。

l  裁剪空间

裁剪空间即为相机的视锥体空间,在这个空间中我们需要判断场景中的三角图元是否在相机的视锥体中,我们需要裁剪剔除不在视锥体中的图元。视锥体有两种类型,分别对应两种投影方式:正交投影和透视投影,如下图所示。

透视投影(左)和正交投影(右)


由观察空间变换到裁剪空间只需要将观察空间中的坐标右乘投影矩阵。

透视投影矩阵


 

正交投影矩阵

投影变换之后还需要判断坐标是否位于视锥体中,判断条件很简单,如果投影变换后的顶点在视锥体内,那么投影变换的坐标必须满足,若存在任一分量不满足,则该顶点需要被剔除。

 

l  NDC空间(归一化设备坐标空间)

得到裁剪空间的坐标后,我们只需要将坐标的x,y,z分量除以w分量,即该坐标就被转换到NDC坐标空间。这一步叫做齐次除法或透视除法。如下图所示。


l  屏幕空间

得到NDC空间的坐标后,进行屏幕映射,即进行如下计算,即可将坐标转换成屏幕空间坐标。

2.3 纹理映射

纹理映射(也译作纹理贴图),就是将图像数据映射到网格三角形上的技术,为场景中的模型增添表面效果,令其更加真实。

2.3.1 纹理

纹理是一种反映图像中同质现象的视觉特征,它体现了物体表面的具有缓慢变化或者周期性变化的表面结构组织排列属性。纹理具有三大标志:某种局部序列性不断重复、非随机排列、纹理区域内大致为均匀的统一体。纹理不同于灰度、颜色等图像特征,它通过像素及其周围空间邻域的灰度分布来表现,即:局部纹理信息。局部纹理信息不同程度的重复性,即全局纹理信息。

在计算机图形中,纹理图是为对象提供纹理外观的像素颜色的位图。在Direct3D中,有几种类型的纹理:一维、二维、 三维,其中每个都可以创建带有或不带 mipmap层级的纹理。 Direct3D 还支持纹理数组和多重采样纹理。

mipmap层级

如果纹理图的基本尺寸是256x256像素的话,它mipmap就会有8个层级,因为每个层级是上一层级的四分之一的大小,依次层级大小就是:128x128、64x64、32x32、16x16、8x8、4x4、2x2、1x1。当纹理图被缩小或者只需要从远距离观看时,mipmap就会转换到适当的层级。事实上,在三线性过滤(trilinear filtering)起作用时,会在两个相近的层级之间切换。

因为mipmap纹理图需要被读取的像素远少于普通纹理图,所以渲染的速度得到了提升。而且操作的时间减少了,因为mipmap的图片已经是做过抗锯齿处理的,从而减少了实时渲染的负担。放大和缩小也因为mipmap而变得更有效率。

纹理坐标

一般图形API都会定义自己的纹理坐标系,在DirectX中采用的纹理坐标系的原点位于纹理的左上角处,如下图所示。纹理坐标的取值范围均采用的是归一化的坐标区间[0,1]。


纹理寻址模式

Direct3D 应用程序可以将纹理坐标分配至任何基元的任何顶点。通常,你分配至某个顶点的 u 纹理以及 v 纹理坐标的范围介于 0.0-1.0(包含这两个值)。但如果在此范围之外分配纹理坐标,则可以创造某些特殊的纹理效果。主要有如下类型:

l  Wrap      在每个整数点重复纹理。

l  Mirror     以每个整数为界映射纹理。

l  Clamp     你的纹理坐标到 clamps [0.0,1.0]范围;Clamp 模式将纹理应用一次,然后被抹去边缘像素的颜色。

l  Border Color  对于超出 0.0-1.0(包括这两者)范围的任何纹理坐标,使用任意的边框颜色。


纹理采样

执行纹理采样操作时,由于场景物体表面与所使用纹理图的分辨率不一致,通常纹理图会被放大或缩小。也就是说,该纹理会被映射到大于或小于自身的基元图像。放大纹理可使多个像素映射到一个纹素。由此可能生成大块的图像。放大纹理通常指单个像素被映射到多个纹素。由此获得的图像可能模糊不清或混叠。要解决这些问题,必须进行一些纹素颜色的混合,以混合出一种适合的像素颜色。

Direct3D 使复杂的纹理采样过程变得简单。Direct3D 提供四类纹理采样方式,即最近邻采样,双线性插值采样、各向异性采样以及 mipmap 采样。如果你未选择任何纹理采样,则 Direct3D 默认会使用最近邻采样。

2.3.2 渲染到纹理的技术

将数据渲染到一个纹理图后,在用它作为着色器的资源,这种方法叫做渲染到纹理的技术。


本文标题:实时渲染基础知识 - 八卦谈
本文地址:www.ttdhp.com/article/32870.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们