3D数字基础&渲染基础

坐标变换

相机的正交投影和透视投影

Unity实例

渲染管线流程

渲染管线的概念

计算机的渲染管线是实时渲染的重要过程。渲染.管线是以流水线的形式,将一个模型的顶点坐标,法线,切线,颜色等数据信息从CPU传递给GPU,然后通过GPU进行计算,最终将这些顶点数据通过插值的形式显示到屏幕上,最终能从屏幕上看到该模型的样子。渲染管线通常被分为四个阶段:应用阶段,几何阶段,光栅化阶段,像素处理.阶段。接下来将介绍每个阶段的大概任务:

(1) 应用阶段:应用阶段是指在CPU端进行处理的阶段,包括物理碰撞检测、物理模拟、动画计算等任务,对于3D游戏来说,游戏中包含大量的模型,3D模型中保存着模型的顶点坐标,法线,切线,颜色等数据,这些数据一般通过向量进行存储,CPU从模型中获取这些顶点信息数据,并将这些数据传送给GPU作为最开始的输入数据。然后将数据送到渲染管线中。

(2) 几何阶段:几何阶段主要执行顶点.坐标变换、顶点处理、坐标裁剪等操作,计算对象为顶点数据,即模型的顶点数据,在这个阶段,做的最多的操作就是顶点坐标变换,从模型空间变换到世界空间,然后再从世界空间变换至相机空间。这样在相机坐标系下就能方便地进行裁剪,裁剪的作用是判断顶点是否可见。

(3) 光栅化阶段:相比于屏幕上的像素点,顶点数据要少很多,这就有一个问题:无法实现从顶点数据到屏幕像素上的映射。而为了达到这一目的,就出现了顶点插值运算,即将两个顶点之间的空缺部分通过插值的形式进行填充,以达到能实现从顶点数据到像素上的一一映射,最后将渲染的结果显示到屏幕上。

(4) 像素处理阶段:像素处理阶段包括像素颜色计算、像素变换,透明度混合等操作,处理物体渲染顺序及深度测试等。这个阶段要处理的内容比较多,可以在此阶段中利用一些算法实现非常多的屏幕特效,比如高斯模糊,景深等,此阶段是游戏渲染中应用非常广泛的阶段,但因为计算对象是像素点,因此实现相关特效时比较耗费性能。

渲染管线流程

渲染管线以流水线的方式进行工作,前一部分的输出值是后一部分的输入值,例如,当顶点信息传入顶点着色器后,顶点着色器对这些定点信息进行坐标变换,输出的值会传入片元着色器,作为输入值做进一步计算,直到完成在屏幕上的显示。虽然渲染管线的整个流程比较复杂,但是大部分操作是通过计算机硬件自动计算完成的,如图元.组装和光栅.化阶段,不需要人们干涉。而需要编程实现的部分就是顶点着色器和片元.着色器。这两个可编程着色器是渲染管线中对数据操作的核心之处,通过这两个着色器的计算,便可实现非常多的渲染效果和计算机图形特效。

渲染管线可以被视为计算机图形学的核心知识,渲染管线决定着计算机进行图形化渲染的整个流程,从数据顶点信息,通过一步步运算,以流水线的方式,最终处理成屏幕像素点,这个过程就需要渲染管线进行操控。
在当今知名的游戏引擎里,程序员均可对渲染管线中可编程阶段进行操控,实现在GPU上的编程计算工作,实现想要的屏幕效果。渲染管线最重要的两个阶段就是顶点着色器和片元着色器这两个阶段了,因为这两个阶段是可编程阶段。目前众多的图形API,如OpenGL和DirectX都会提供想应的接口,供使用者自定义渲染方案。

在渲染管线的渲染流程中,顶点数据的变换过程如下:
img

渲染管线几个阶段

(1) 顶点数据:一个模型或者图形是由点线面构成的,为了让计算机绘制出这个图形,就必须告诉计算机这些数据的值,顶点数据包括顶点坐标,坐标的切线,法线,颜色等信息,对于OpenGL,这些数据一般都是向量(Vector)结构体,对于游戏引擎,这些数据来自导入的模型当中,在开始渲染之前,CPU会获取这些数据,然后将其传递给GPU,作为最原始数据,做好计算准备。

(2) 顶点着色器:顶点着色器(Vertex Shader)在渲染管线中的作用非常大,是渲染管线的第一个可编.程着色器,处理单元是顶点数据。顶点着色器的主要功能是对坐.标进行.变换。将输入的局部坐标变换到世界坐标、观察坐标和裁剪坐标。除此之外当然也可以进行光照着色,但是着色效果远不如在片元着色器中进行光照着色,因为计算量较小。

(3) 图元装配:图元装配(Primitive Assembly)是对传入的顶点数据进行重新组装,将顶点着色器的输出作为输入,这一点正验证了渲染的过程是以流水线的形式进行的,图元装配会将顶点装配成指定的图形,与此同时,会进行裁剪、被面剔除等操作,以减少不必要的计算,加速渲染过程。

(4) 几何着色器:几何着色器(Geometry Shader)会将图元装配阶段输出的数据作为输入数据。几何着色器不属于可编程阶段,由硬件设备自动完成,其主要作用是对顶点数据进行重构,可以在此阶段产生新的顶点数据,来弥补之前存在的一些问题。以便为接下来要进行的操作做好充分的准备工作。

(5) 光栅化:光栅化阶段(Rasterization Stage)的输入数据来自几何着色器的输出数据,光.栅化的意思很容易理解,到目前为止,渲染所处理的数据对象为顶点,无法通过一一对应的方式映射到屏幕上,而为了实现顶点到屏幕像素的一一映射,就出现了光栅化。换而言之,光栅.化的作用就是将两个顶点直接缺少的像素点通过插值的形式进行补充,生成片元着.色器可以处理的片段。此阶段.人为不可干涉,由硬件完成插值计算。在插值的过程中,会将不可见的顶点进行剔除。

(6) 片元着色器:片元着色器处理的对象将是像素点的颜色信息,也是最终显示在屏幕上的像素点,在这个过程中,可以处理光照和阴影计算,将处理完的值保存至缓冲区当中。

(7) 混合处理阶段:混合处理阶段属于屏幕后期处理范围,这意味着此阶段主要做的任务为屏幕优化操作,通过片元着色器得到的像素,有些不能被显示出来,比如透明度为0的像素点,对于这类像素点,我们需要进行测试,测试的范围包括Alpha测试、模板测试和深度测试等。不能通过测试的像素点将会被丢弃,就不会参与接下来的操作;通过测试的像素点会进入混合阶段。混合阶段主要是要处理透明物体,物体的透明度通过Alpha值来表示,范围是从0.至.1, alpha=1表示完全不透明,alpha=0表示完全透明。测试混合阶段基本不需要进行编程,但是常见的渲染管线接口会开放出一些参数给开发者.做调整。

光照与阴影

延迟渲染

光照

阴影

次世代渲染基础

算法

画线

DDA算法

中点算法

floodfill算法

抗锯齿算法

SSAA

MSAA

CSAA

FSAA

TAA

应用

Unity shader

性能优化

原理与方向

mipmap

应用1:使用批处理

应用2:使用GPU Instance

文章参考&特别鸣谢

《游戏开发:筑梦之路》

《Unity ShaderLab新手宝典》

https://www.yuque.com/guicun/cgrxvm/vzshpr#QqGqd

https://www.bilibili.com/video/BV1X7411F744

https://catlikecoding.com/

https://www.zhihu.com/people/niuxingxing