目录
CPU与GPU
数据处理
点的数据
面的数据
摄像机数据
灯光数据
材质球
渲染管线
顶点处理(Vertex Shder)
生成三角形
光栅化
像素着色
后处理(Post -Process)
CPU与GPU
首先,让我们先认识两个处理器
GPU:图形处理器--显卡重要组成部分(决定画面好坏)
CPU:中央处理器--对数据的控制
CPU命令GPU进行渲染,告诉GPU应该渲染什么部分,为GPU准备所需要的东西
那CPU是怎么准备数据的呢?
数据处理
渲染首先要有一个3D模型,但在CPU眼中其实就是一堆数据
点的数据
例如一个立方体,我们若想用数据准确描述,首先应该有顶点,再有法线,顶点色等
这些数据有一个更专业的说法--顶点缓存(Vertex Buffer)
而仅仅有点的数据是完全不够的,还应该有面的数据来构成3D模型
面的数据
每3个顶点构成一个面--三角面(Triangle)
而每一个三角面会记录绘制它的顶点号码(如图,0,1,3...),而(0,1,2)、(2,3,0)就是索引(Index)
该立方体所有索引数据结合就是--索引缓存(Index Buffer)
模型准备好后,还需知道玩家在哪里
摄像机数据
除了最基本的位置和方向,还需要知道范围
即是FOV(find of view)
并且摄像机不能看的无穷远,也不能看的无穷近,所以会进行两个设置,近平面(Near ClipPlane)与远平面裁切(Far ClipPlane)
而被裁切出来蓝色部分就叫做视锥(Frustrum)
为了让我们的3D模型有光影效果,为场景添加光线
灯光数据
添加光线,例如太阳光(平行光),需要方向,颜色,强度等数据
材质球
CPU准备Shader(着色器)--一段代码,去告诉GPU该如何渲染模型
而光有这一段代码是不够的,Shder还要引用某些贴图以及各种需要调节的参数
而这些数据综合起来构成材质球这么一个概念
至此GPU所需数据基本准备完毕
渲染管线
如图,GPU将CPU打包数据进行一连串处理,这些处理过程就是渲染管线(其中,绿色部分表示可进行编程修改阶段,即Shder发挥作用的阶段)
顶点处理(Vertex Shder)
用之前CPU已准备好的模型顶点数据,在这一步可对其他属性做一些额外处理,例如:顶点动画
但最重要的还是把这些顶点变换到裁切空间(Clip Space)中,将模型的顶点变换到世界空间(Worls Space),再变换到摄像机空间(View Space),最后把它变换到裁切空间(Clip Space)
有了裁切空间,我们可以很方便地把顶点投影到屏幕(Screen Space)上
就像是把一个3D的东西拍平成一个二维的平面,并且可以根据屏幕的像素大小把这些点映射到我们屏幕的对应位置。即使经过了多次变化,但是点跟点的连接并没有变,就是说之前在3D空间中,哪三个点构成一个三角形,在屏幕上也是这三个点构成一个三角形
生成三角形
所以这个阶段GPU就开始遍历我们模型上的所有三角形,也就相当于把模型的三角面投影到了我们屏幕上。
光栅化
但我们的显示器是由一个像素组成,所以这一步就要把这些三角形变成,屏幕上对应的像素,也就是所谓的光栅化
像素着色
主要对我们的模型效果产生变化的阶段
可以根据灯光做出明暗变化的效果
也可以根据贴图坐标去采样贴图
后处理(Post -Process)
最后我们得到一个绘制完的结果,但一般情况下,我们不会直接将结果输出到屏幕上,还会对这一张图做进一步的处理,比如看锯齿、校色,添加bloom之类