深入理解着色器(渲染管线)

如果想要深入理解着色器,必不可少的一环就是了解渲染管线,其实着色器是渲染管线重要的一环,而将一个3D物体渲染到屏幕上,就必须经过渲染管线的渲染,简单的讲,渲染管线的作用就是将某一个图形或者模型细化为无数的顶点与纹理等相关信息,然后将这些信息转化为一张人眼可见的二维图片,也就是上一篇博客中提到的视景体中的内容。着色器空间概念

事实上,在unity的底层,有两种渲染管线,分别是OpenGL、DirectX,根据不同平台的发布,有不同的3D程序接口。

OpenGl渲染管线

在这里插入图片描述
上图是他的渲染过程:

基本处理

其的主要任务是对顶点进行齐次坐标变换与光照处理,本阶段能够对顶点缓冲与索引缓冲中的数据进行处理。

索引缓冲

索引缓冲可以记录每个顶点之间的关联情况。

顶点缓冲

顶点缓冲储存每个定点的相关数据

顶点着色器

顶点着色器是一个可编程处理单元,能够对顶点进行变换,光照,材质应用于计算等相关操作,其处理单位是顶点。
注意顶点着色器不能新建或者删除任意顶点的能力,也不能获得顶点之间的关系,只能批量的处理每一个单独顶点。
基本功能如下:
原始的顶点信息算送到着色器中,顶点着色器从物体空间变换到剪裁空间,同事根据顶点的关照,纹理等对顶点的颜色进行计算,处理完之后,将定点的数据传送到曲面细分、变换反馈、或者图元装配等阶段。

曲面细分着色器

曲面细分又分为两个阶段,分别是曲面细分控制与曲面细分计算,他是一个可选的着色器,而细分过程并不对基本的几何土元进行操作,而是使用一个新的图元(面片),简单的可以说,曲面细分就是将传入的顶点分成三个一组三个一组,然后三个顶点形成的的三角形面,多个三角形面组成的整体就是面片,所以细分曲面的作用就是对顶点进行处理。

曲面细分控制着色器

以一组控制点作为输入,输出一个面元进入曲面细分计算着色器,开发人员可以在这里删除、添加修改顶点还可以确定曲面细分的精度,简单点说,就是一个面片的生成,需要多少哥三角形

曲面细分计算着色器

既然是计算着色器,那么一定是计算什么,在这里计算的就是将曲面细分控制着色器出来的面片中每一组三角形面的质心坐标,并且在质心坐标下生成一个真正的顶点,注意,在这里不能丢弃任何一个顶点

变换反馈

所谓的变换反馈,就是重新补货即将装配的面元(点、线段、三角形)的顶点,然后将这些数据传送到缓冲对象中,这样就可以通过回读来进行后续的渲染操作

图元装配

这一阶段有两个任务,第一个就是图元组装,另一个是图元处理
图元组装的任务就是指顶点数据根据绘制方式来组合成完成的图元
图元处理的主要任务就是剪裁,就是消除不应该存在的部分几何图元,之所以要剪裁就是,不同的角度看同样的物体,看到的不一定是一样的,在上一篇博客中知道,在最终成型的2维图片中所出现的其实是视景体里面的内容,其余我们看不到的,则全部被剪裁

片元着色器

执行纹理的采样、颜色的汇总等操作,其主要功能是计算出片元进行光栅化后所产生的每个偏远的颜色属性

逐片元操作

主要功能就是确定偏远的可见性,比如进行深度、模板测试等,另一个就是将偏远的颜色与缓冲区的颜色进行混合。
所谓深度测试就是,若输入的片元的深度值小则将输入片元送入下一个阶段,准备覆盖帧缓冲中的原片元,或者与其混合,否则丢弃该面元。

帧缓冲

OpenGL中物体的绘制并不是直接在屏幕上进行,而是预先在帧缓冲区中进行绘制,每绘制完一帧就会将绘制后的结果交换到屏幕上,,在应对不同方面的需求上,帧缓冲是由同一套组件组成的,主要包括颜色缓冲、深度缓冲、模板缓冲。
其中颜色缓冲:用于储存每个片元的深度值,每个颜色共有红、蓝、绿、黄、四个彩色通道,当程序运行时,我们所能看到的颜色就是颜色缓冲的结果。
深度缓冲:深度缓冲就是用来储存每个片元的深度值,深度值是指以特定的内容格式表示的从片元到观察点(摄像机)的距离。
模板缓冲:模板缓冲是用来储存每个片元的末班之,供模板测试使用。

DirectX

在这里插入图片描述
这个渲染管线与OpenGL的渲染管线基本相同,如上图,其中曲面细分与域着色器共同完成的是曲面细分功能,曲面细分根据壳着色器传出的结果进行图元的划分,流输出与变换反馈相对应。

发布了67 篇原创文章 · 获赞 3 · 访问量 1887

猜你喜欢

转载自blog.csdn.net/lfanyize/article/details/103708961