3D渲染——图形渲染管线
作者:互联网
如有错误欢迎指正(_)
图形渲染管线的主要功能就是在给定相机、三维物体、光源、照明模式和纹理等信息的情况下,渲染出一副二维图像。
主要分成4个阶段:
应用程序阶段、几何阶段、光栅化阶段和像素处理阶段,每个阶段又可以是一个管线。
pipeline stage 可以并行地执行,一个理想的nonpipeline可以被系统分成好几个pipeline stage进行执行。
下面分别介绍一下各个阶段的任务和执行过程。
应用程序阶段
这个阶段的主要任务就讲要绘制的图元输入到绘制管线的下一个阶段,这一阶段的一些工作可以通过GPU完成,这里要用到的计算着色器(compute shader)把GPU当成一个高度并行的通用处理器。主要的工作有碰撞检测,加速算法,输入检测,动画,力反馈以及纹理动画,变换仿真,几何变形等等计算。最后会将几何信息(渲染的图元信息,比如点、线或三角形)提供给下一阶段——几个处理阶段。
几何处理阶段
这个阶段主要处理变换、映射等类型的任务,通常是在GPU上执行。它又分为以下五个功能阶段:
1.模型和视点变换
2.顶点着色
3.投影
4.剪裁
5.屏幕映射
模型和视点变换
每一个模型都会和一个模型转换关联,这样它就可以被定位或者定向,模型转换的是模型的顶点和法线。首先一个物体本身的坐标叫模型坐标,我们第一步要把这个模型坐标通过模型转换到世界坐标上去,因为世界坐标是唯一的,这样就能够统一模型的坐标了。接着为了方便后续的投影和剪裁的操作,我们再把相机和模型经过一个视图变换,将相机的位置放到世界坐标的原点上,并且让相机看向负z轴方向,y朝上,x朝右。这么变换之后,模型就处于相机坐标中了。
总结这个阶段是1)通过模型变换,将模型变换到适当的渲染空间上去
2)通过视图变换,将相机位置放置到坐标原点上,方便后续的操作
顶点着色
这一阶段的主要任务是:
1)计算顶点的位置
2)计算顶点的输出信息,例如颜色、纹理坐标、法线等等
着色: 灯光在材质上的效果的操作
着色的过程就是在对象的各个点上计算着色方程,一般都是在模型的顶点上执行。大部分的物体着色都是通过对每个顶点的位置和法线应用光照把产生的颜色存储在顶点中来计算的,并且一般都是在世界坐标系上执行。
这个阶段计算出的顶点的着色的结果会被发送到光栅化阶段进行插值操作。
总结这个阶段的目的是要确定模型上顶点处材质的光照效果。
投影
将view volume变换到一个对角顶点分别是(-1,-1,-1)和(1,1,1)的单位立方体(unit cube)内。主要有两种投影方式
1)正交投影:形成的投影是标准尺寸大小,不会产生偏差,一般用在建模、工业上面
2)透视投影:越远离相机的物体,它投影后看起来越小。
经过投影之后(一些矩阵变换)把view volume变换到一个unit cube当中去,这样显示后的坐标 z 就不存储在生成的图像中了,而是单独存储在z-buffer当中,所以也可以说模型从3D空间被投影到了2D空间。
总结:就是一个把模型从3D空间投射到2D空间的过程。
剪裁
只有存在于view volume的图元部分才需要发送到光栅化阶段在屏幕上绘制出来。所以这部分分成3种情况
1)图元完全处于unit cube当中,那么直接进行下一阶段
2)图元完全在unit cube外面,直接丢弃,无需渲染
3)图元部分处于unit cube中,那么要对处于unit cube内部的图元进行剪裁
总结:对部分处于unit cube中的图元进行剪裁
屏幕映射
屏幕坐标系和z坐标一起被称为窗口坐标系。窗口坐标系中,OpenGL把左下角作为值最小元素(原点)(0,0),右上角为最大元素,而DirectX有时根据上下会把左上角定义为原点。屏幕映射会先进行平移再进行缩放。
(整形和浮点型的点值如何与像素坐标进行关联????)
总结:将图形映射到成像平面上,即将之前得到的坐标映射到对应的屏幕坐标系上。
光栅化阶段
分成2大部分,4个阶段
首先是三角形设定,这个阶段主要是用来计算三角形表面的差异和三角形表面的其他相关数据的。这些数据用于接下来的三角形遍历以及 几何阶段获得的着色数据的插值操作。
三角形遍历,逐个像素检查该像素的像素中心是否由三角形覆盖,被三角形覆盖的部分产生一个fragment,三角形的每一个fragment都是通过在三角形三个顶点之间进行数据插值产生的(讲真,我根本没明白这说的是什么鬼话/(ㄒoㄒ)/~~,有人能给我解释解释么)
总结:找到哪些采样点或像素在三角形中的过程
像素着色阶段,把使用插值得到的数据作为输入,最终的产出是每个fragment的像素值,这些数据会被传递到下一个子阶段。这个阶段一般是在GPU上执行。它是计算所有需逐像素操作的过程。
融合阶段,这个阶段主要任务1)合成fragment的颜色,这些颜色由像素着色阶段产生的,存储在缓冲器当中。
2)这个阶段也负责解决可见性问题(visibility)。当整个场景被渲染后,color buffer中存储的应该是在相机视点可见的场景中的图元的颜色。
总结:
几何阶段的流程:
首先对模型的顶点和法线进行矩阵变换,把模型转换到观察空间当中去(模型和视图变换);
然后根据材质,纹理以及光源属性进行顶点光照计算(顶点着色阶段);
然后将模型投影变换到一个单位立方体内(投影阶段);
然后要舍弃立方体之外的图元,得到立方体内部的图元,就要对与单位立方体相交的图元进行裁剪(裁剪阶段);
然后将顶点映射到屏幕上的窗口中/成像平面上(屏幕映射);
然后对每个多边形执行完这些个操作之后,将最终的数据传递到光栅化阶段;
光栅化阶段:
首先计算三角形表面差异和三角形表面其他相关数据(三角形设定阶段);
然后逐个遍历像素点,找到哪些采样点或像素点被三角形覆盖(三角形遍历阶段);
然后计算所有需要逐个像素计算的操作(像素着色阶段);
然后合成片段颜色
然后通过Z缓存处理可见性问题。
所有对象依次处理,最后图像显示在屏幕上。
标签:渲染,模型,像素,阶段,顶点,三角形,图元,管线,3D 来源: https://blog.csdn.net/snow_874142640/article/details/118967793