主要是对第二章的整理
渲染流水线:由一个三维场景出发,生成(渲染)一张二维图像。
渲染流程:应用阶段、几何阶段、光栅化阶段。
应用阶段:
1. 把数据加载到显存中
渲染所需数据从硬盘,到内存,再到显存
2. 设置渲染状态
渲染状态:使用哪个顶点着色器、片元着色器、光源属性、材质等
3. 调用Draw Call
发起方CPU,接收方GPU
GPU流水线
以下为几何阶段主要步骤
顶点着色器:
- CPU输入的每一个顶点都会调用一次顶点着色器
- 不创建或销毁任何顶点,且顶点之间相互独立
- 坐标转换:把顶点坐标从模型空间转换到齐次裁剪空间,归一化的设备坐标NDC(-1,-1,-1)到(1,1,1)
- 可以通过改变顶点位置来模拟水面、布料等
- 逐顶点光照
裁剪:
一个图元和摄像机视野的三种关系:
- 完全在视野内
- 完全在视野外
- 部分在视野内(产生新的顶点)
屏幕映射:
把每个图元的x、y坐标转换到屏幕坐标系
OpenGL:左下角(0,0)
DirectX:左上角(0,0)
以下为光栅化阶段主要步骤
三角形设置:
上一阶段得到的是三角形每条边的两个端点,三角形设置计算边界像素的坐标信息
三角形遍历:
- 检查每个像素是否被一个三角网格所覆盖。如果覆盖,就会生成一个片元(Fragment)
- 一个片元不是真正意义上的像素,而是包含很多状态的集合,这些状态用于计算每个像素的最终颜色。(屏幕坐标、深度信息、法线、纹理坐标等)
片元着色器:
- 计算该片元的输出颜色
- 可以完成很多重要的渲染技术(如纹理采样等)
- 仅可影响单个片元(导数信息例外)
逐片元操作:
- 决定每个片元的可见性(深度测试、模板测试等)
- 通过测试的片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并(混合)
Draw Call中造成性能问题的元凶是CPU
为了让CPU和GPU可以并行工作,两者之间有个命令缓冲区。CPU通过图像编程接口向命令缓冲区添加指令,GPU从中读取指令并执行。
命令缓冲区的指令有很多种类:
- Draw Call
- 改变渲染状态(改变使用的着色器、使用不同的纹理等)
时间: 2024-10-14 10:44:45