目录
前言
虽然已经用C语言实现了图形渲染管线的整套流程,但是对于一些理论还是不够熟悉,于是这里总结面试题方面的理论
1.GPU渲染流程
所有渲染,都是将数据从CPU传输到GPU的过程。
从GPU的视角来看渲染的话,非常简洁明了。对于程序整体框架来说大致分为如下的步骤:
应用程序调用图形API(opengl/dx12)。
API调用GPU 驱动程序。
GPU驱动程序负责将图形API函数转换为GPU可识别编码。
CPU将内存当中的Data传递至GPU。
此时GPU拥有数据与程序代码,就可以执行,并且将图像渲染至屏幕上。
2.图形渲染管线
2.1 渲染管线概览
- 应用程序阶段:运行在CPU上的阶段,一般用于输入操作处理、动画处理、事件处理等等。
- 几何阶段:负责逐个顶点以及逐个图元的操作。
- 光栅化:以变换化过经过投影的顶点与着色信息为基础,逐个像素进行绘制的操作。将屏幕当中的2D Point转换到屏幕上的像素。
2.2 总流程
应用阶段 ——> 几何阶段 ——> 光栅化阶段 ——> 逐片源阶段 ——> 后处理
2.3 应用阶段
设置场景基本数据:收集模型的大小,位置和旋转信息、光源类型和光照信息、摄像机参数
粗粒度剔除和算法加速:剔除不需要发给几何阶段的物体信息 例:视椎体剔除和遮挡剔除
设置渲染状态,准备渲染参数:渲染类型是从后往前还是从前往后等
调用Draw Call:CPU通知GPU可以开始渲染
2.4 几何阶段
1、顶点数据的输入
2、顶点着色器(世界变换矩阵)
顶点变换:模型坐标系 ——> 世界坐标系 ——> 观察坐标系 ——> 投影坐标系 俗称:MVP矩阵
顶点着色:计算顶点光照等数据 并设置顶点颜色
3、曲面细分(将三角形分成多个三角形,可选)
4、几何着色器(将点分成线或多边形 可选)
5、图元组装
投影:根据摄像机类型(正交或透视)转化到归一化的设备坐标
裁剪:超出屏幕不用渲染
剔除:背面的点不用渲染
屏幕映射:从-1到1的投影坐标系,映射到正式的屏幕的坐标位置
2.5 光栅化阶段
6、光栅化
通过插值方法计算片段的颜色信息
2.6 逐片源阶段
7、片段着色器 决定屏幕最终颜色,实现逐个片元的着色操作
8、混合及测试
- 透明度测试
- 模板测试和深度测试
- 将通过测试的片元与颜色缓冲区的颜色混合
9、输出到目标缓冲区:可能是帧缓冲区( FrameBuffer) 或者渲染贴图 (RenderTexture)
2.7 后处理
- 各种屏幕上的效果:景深,bloom,高斯模糊等