什么是渲染管道,怎么绘制3D物体

目录

CPU中做的事情

Vertex Buffer(顶点缓存)

 Index Buffer(索引缓冲区)

 摄像机

灯光数据

材质球

GPU中做的事情

Vertex Shader(顶点着色器)

 Triangle Processing(遍历三角面)

Rasteriaztion(光栅化)

Pixel Shader(像素着色)

Post-process(后处理)

总结


首先我们应该了解什么是渲染。相信了解电脑的朋友们对显卡并不陌生,而显卡其实就是我们的GPU(图形处理器),而我们的电脑还有一个核心就是CPU(处理器)。CPU会对GPU下达指令去渲染什么画面。比如有一个立方体,CPU他不知道立方体是什么东西,在它眼里,它只是一组数据。那这些数据到底是什么呢?

CPU中做的事情

Vertex Buffer(顶点缓存)

我们知道3D模型其实是由一堆顶点(Vertex)构成的,就像立方体会由八个顶点组成,我们会用八组数据来描述这些顶点,例如(0,0,0)。除了顶点,我们还有别的信息,像uv信息(贴图坐标)、法线(Normal)顶点色等一些属性。就是我们的Vertex Buffer(顶点缓存)数据。

 Index Buffer(索引缓冲区)

我们知道立方体是由面构成的,所以我们还要准备一组数据在绘制这些面,在3D渲染中,每三个顶点会构成一个面,形成一个三角面。一个三角面会记录绘制它的顶点号码,用来做索引(Index),通过索引可以去绘制这个三角面。而这个数据就被称为Index Buffer(索引缓冲区)。

 摄像机

模型数据准备好后,我们还得知道玩家在哪个方向看我们的模型,也就是我们的摄像机,摄像机除了位置和方向还有设置它能看到的范围,也就是FOV(field of view)。因为摄像机不能看得无限远也不能看得无限近,所以还会设置近平面(NearClipPlane)跟远平面(FarClipPlane),根据这个两个面裁切下来的叫视锥(Frustum)。

灯光数据

为了我们的3D模型有光影效果,我们还得为场景添加一个光线,光线有太阳光(平行光)、点光源、聚光灯、区域光。不同的光线有不同的参数数据,比如方向、颜色、强度等参数。我们可以统称为灯光数据。

材质球

我们希望我们的3D模型不要很单调,所以我们准备好一个材质球赋给我们的3D模型,让模型有不同的效果,比如金属、木头、石头等等。材质球是让大家更好理解的一个概念,在CPU中,其实就是Shader(着色器),它是一段代码告诉GPU要如何去渲染我们的模型。除了这些代码还不够,因为Shader还要引用某些贴图,有各种需要调整的参数。这些数据就构成材质球的这么一个概念。shader是材质球的核心。

GPU中做的事情

当准备好这些内容之后呢,CPU就可以对GPU发号施令,说:“按照我们给你的这些数据,帮我把它画出来”。GPU接到数据后就会经过一连串的处理,把最终输出结果绘制到屏幕上面,这个一连串的处理就是渲染管线(RederingPipecacline)。这就是渲染管线的具体流程:

其中标箭头的阶段是可以进行编程修改的,这些阶段就是shader发挥作用的地方。

Vertex Shader(顶点着色器)

第一步就是我们的顶点处理或者叫顶点着色器(Vertex Shader),这里会用到之前CPU给我们准备的模型顶点数据。在这一步我们对顶点的位置和其他属性做一些额外的处理,比如常见的顶点动画,但最主要的还是把这些顶点变换到我们的裁切空间(Clip Space)上面,这里需要了解矩阵变换,这里会用到多个矩阵和视锥,将模型的顶点变换到世界空间(World Space)然后再变换到摄像机空间(View Space),最后把它变到裁剪空间(Clip Space)。

 Triangle Processing(遍历三角面)

有了裁切空间,我们就可以把顶点投影到我们的屏幕上面(Screen Space),就像是一个3D的东西拍平成一个二维平面,并且可以根据屏幕的像素大小把这些点映射到我们屏幕的对应位置,即使经过多次变化,但是点跟点的连接并没有变。第二阶段GPU就开始遍历我们模型上的所有三角形,把模型的三角面投影到了我们的屏幕上。

Rasteriaztion(光栅化)

因为我们的屏幕是由一个个像素组成,所以这一步就要把这些三角形变成屏幕上对应的像素,也就是所谓的光栅化(Rasterization)。这一部GPU为我们做了很多工作,比如三角面之间会有遮挡关系,它就会帮我们剔除掉那些被遮挡的像素。而且因为每个像素其实是由这些相连的点生成的,所以每个像素会根据这些点计算,插值出准确的数据。这样每个像素上都会有准确的数据,能给到下一个阶段进行进一步的处理和计算

Pixel Shader(像素着色)

遍历完所以的像素,我们就来到了像素着色(Pixel Shader)阶段,也是Shader发挥作用的地方,是主要对我们的模型效果产生变化的阶段,这里我们可以根据灯光做出明暗变化的效果,也可以根据贴图坐标去采样贴图,让我们的模型有纹理细节

Post-process(后处理)

最后我们得到一张绘制完的结果,不过一般我们不会直接把结果输出到屏幕上,还会对这张图做处理,比如看锯齿、校色、添加bloom(辉光)之类的,我们把这个阶段叫做后处理(post-process)经过处理,屏幕就可以展示我们最后的渲染效果了。

总结

当然,这只是一个最基本的流程概念,本章只是对渲染有一个基本的概念,可以为我们后续进一步理解打好基础。本章是用来本人理解渲染概念,如果有什么不足的地方,还希望有大佬可以指出来。

猜你喜欢

转载自blog.csdn.net/weixin_47042152/article/details/125856055
今日推荐