(一)渲染流程

1.前言

在进行unity shader基础教程前先对渲染流程进行简单讲解。对于重点位置会进行着重说明。这是一篇比较好的参考资料

2.渲染流程图

此渲染流程图取自前言中参考资料比较典型,本文基于此图展开说明。
在这里插入图片描述

2.1 应用阶段

应用阶段是指开发者进行场景开发阶段,完全是由开发者主导的部分,此部分由CPU主导。在此部分可以设置场景设置,防止模型,放置摄像机以及灯光等。此部分形成渲染图元,即点、线、面以及纹理等数据,然后交给GPU进行下一阶段处理。

2.2 几何阶段

上图中几何阶段的流水线个人认为是不合适的,几何阶段流水线如下:顶点着色器->曲面细分着色器->几何着色器->裁剪->屏幕映射。此阶段的任务是将上一阶段传递过来的数据,即最基本的顶点信息由模型空间坐标系转换到屏幕坐标系下。
由于曲面细分着色器和几何着色器是可选着色器,前者用于细分图元,后者进行逐图元着色。所以此阶段可以简单理解为顶点着色->裁剪->屏幕映射。以下详解此三个阶段。

2.2.1 顶点着色器

此阶段任务包括但不限于:坐标变换、逐顶点光照以及输出坐标纹理等。渲染流程中存在如下几个坐标空间:
模型空间:也称为对象空间,即模型的局部坐标系。
世界空间:即所有模型所在的统一坐标系。
观察空间:即摄像机空间,对应摄像机坐标系,存在正交相机坐标系和透视相机坐标系。
裁剪空间:即将观察空间坐标系下的物体转换到裁剪空间下进行裁剪,即将不在裁剪范围内的模型去掉,在边界上的进行裁剪。
屏幕空间:最终形成的图像显示屏幕空间。
此阶段坐标变换的目的就是将顶点从模型空间转换到裁剪空间,这也是顶点着色器最基本的任务。也可以在此阶段输出顶点的纹理坐标uv。

2.2.2 裁剪

将观察空间坐标系下的物体转换到裁剪空间下单位立方体内进行裁剪,即将不在裁剪范围内的模型去掉,在边界上的进行裁剪。

2.2.3 屏幕映射

此阶段将顶点信息映射到屏幕坐标系中,即映射到二维空间中。此时是没有z值的,但是z值会作为深度信息进行存储。屏幕坐标系又和z坐标构成窗口坐标系。

2.3 光栅化阶段

此阶段主要针对上一阶段产生的数据(即经过坐标变化的顶点以及传递过来的纹理坐标等信息)进行操作。包括三角形设置、三角形遍历、片元着色器等,此阶段根据各种信息生成像素信息。

2.3.1 三角形设置与遍历

此阶段根据上一阶段的顶点数据生成三角形,包括三角形的顶点信息、边界以及对应顶点的uv等信息。然后根据三角形进行三角形遍历,最上图中指出三角形遍历是只遍历三角形,然后检测像素是否在三角形中。个人理解应该是遍历像素,检测每个像素是否则三角形中(结果是否一样?),然后根据三角形顶点信息,计算每个像素的位置、纹理等信息,然后生成片元,交给片元着色器进行逐片元处理。

2.3.2 片元着色器

片元着色器则进行逐片元操作,根据每个片元的位置uv等信息生成相应的像素信息。片元着色器又会被成为像素着色器,虽然此阶段会生成对应位置的像素,但是此阶段是处理片元的。

2.3.3 后续

最后进行逐片元操作,根据生成的像素信息,考虑深度测试以及是否开启混合等生成最终的像素信息。

3.结语

上述为最基本流程的描述,为了是能够理解顶点/片元着色器,以及他们所处的渲染角色,更好的理解Shader,由于水平有限,难免有误,欢迎指正。

猜你喜欢

转载自www.cnblogs.com/llstart-new0201/p/11949743.html