渲染管线流程
渲染管线流程:顶点数据输入、顶点着色器、曲面细分过程、几何着色器、图元组装、裁剪剔除、光栅化、片段着色器、混合测试
每个阶段会把前一个阶段的输出作为该阶段的输入
各项流程简述
1.顶点数据输入:输入装配阶段,送入到渲染管线的数据包括顶点坐标、纹理坐标、顶点法线和顶点颜色等顶点属性。
顶点数据在流水线中以图元的方式处理,常见的图元包括:点、线、线条、三角面
2.顶点着色器:主要功能是进行坐标变换,将输入的局部坐标变换到世界坐标、观察坐标、裁剪坐标。
- 平面着色:最简单最快效果也是最差的着色方式;
- 高洛德着色:中等的一种,因为高光并非是线性变换,所以插值得到的效果较差;
- 冯氏着色:在片段着色器阶段进行的一种着色方式,效果最好,但计算量最多,自然也最慢
3.曲面细分:可选,曲面细分是利用镶嵌化处理技术对三角面进行细分,以此来增加物体表面的三角面的数量。
曲面细分由外壳着色器、镶嵌器、域着色器构成,其中外壳着色器和域着色器可以编程,镶嵌器是硬件管控的。
我们可以借助曲面细分技术实现细节层次的机制,使得离摄像机越近的物体具有更加丰富的细节,反之则具有较少的细节。
4.几何着色器:可选,几何着色器的输入是完整的图元,可输出图元或者不输出图元,亮点在于它可以创建或销毁图元。
几何着色器可以将输入的点或线扩展成多边形。
5.图元组装:图元组装将输入的顶点组装成指定的图元。图元组装阶段会进行裁剪和背面剔除相关的优化,以减少进入光栅化的图元的数量,加速渲染过程。
- 剪裁:完全位于视锥体外部的图元会被裁剪掉,部分位于视锥体外部的图元会被进行剪裁操作。
- 背面剔除:背对摄像机的图元会被剔除掉
6.屏幕映射的操作:透视除法和视口变换两个操作,这两个操作主要是硬件实现,不同厂商会有不同的设计。最后会得到窗口坐标。
7.光栅化:光栅化将变换到屏幕空间的图元离散化为片元的过程。主要包括两个过程:三角形的组装和三角形的遍历
- 三角形组装:对顶点的输入数据进行插值,得到每个片段的数据值
- 三角形遍历:遍历三角图元覆盖了哪些片段的采样点,随后得到图元所对应的片元
8.片段着色器:片段着色器用来决定屏幕上像素的最终颜色。在这个阶段会进行光照计算以及阴影处理。
- Phong光照模型:朗博余弦定理计算漫反射,半朗博模型提高了漫反射量度信息。反射光线夹角大于90度时镜面反射分量会被消除,高光不连续
- Blinn-Phong光照模型:引入了半角变量,半角向量和法线夹角不会超过90度,不会出现高光不连续的问题
- PBR光照模型:考虑了光照能量守恒,基于粗糙度值,计算了法线半球内所有入射光线经过直接反射到观察点的占比
9.测试混合阶段:测试包括裁切测试、Alpha测试、模板测试和深度测试。经过测试的片段会进入混合阶段。混合阶段进行Alpha混合。测试混合阶段是不可编程阶段,但是我们可以通过OpenGL或DirectX提供的接口进行配置,定制混合和测试的方式。
- 裁切测试:可选,当视口比屏幕窗口小时应用裁切测试将渲染窗口变得和视口一样大,超出的部分进行裁切。
- Alpha测试:根据Alpha值来裁剪片段
- 模板测试:可选,高度可配置,控制选区片段可见性,超出的部分进行裁剪
- 深度测试:统一片段的多个片段,根据深度值,保留并更新深度缓存和颜色缓存,并丢弃其余片段
- Alpha混合:根据片段的alpha值进行混合,用来产生半透明的效果。
更加详细的请参考下述参考链接:
参考来源:https://zhuanlan.zhihu.com/p/79183044