1. CPU处理部分............................................................................... 2
2. 顶点着色器................................................................................... 5
3. 曲面细分着色器........................................................................... 5
4. 几何着色器................................................................................... 5
5. 光栅化........................................................................................... 5
6. 片元着色器................................................................................... 7
drawcall
耗的原因:许多状态的切换(更新寄存器),设置很多渲染参数(哪些顶点被使用,使用shader),驱动层(验证以及转换你的调用)
setpasscall
如果绘制的material没有变化,就不会有
笼统理解
drawcall和setpasscall都是在cpu提交给gpu的命令缓冲中
Gpu从命令缓冲中逐条取出指令,如果看到的指令是setpasscall,则更新渲染状态
shader不同的pass可能需要不同的渲染状态并且drawcall
合批
srpbatcher
动静分离,将经常变化的如transform信息放到一个大的CBuffer中,而将不常变化的显示材质属性,放到独立的小cbuffer中。每次都还需要drawcall,但是由于并未变更显式属性等数据,无需setpasscall,从而减少cpu的消耗
gpuinstance
所有需要instance的物件,网格数据相同,将不同物件不同的部分如transform,颜色等放到一个大的CBuffer中,然后shader根据id来索引不同的部分渲染
shader warm up
shader在打包阶段只是编译成平台独立的字节码
需要根据目标硬件通过warmup在转换成目标具体的可执行字节码
数据准备
VBO
VAO
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 sizeof(float), (void)0);
贴图
将顶点转化到clip空间
三角形设置
三角形裁剪
三角形遍历
决定图元覆盖哪些片元(包含法线、color,uv等插值后的数据)
相机与远近裁剪面关系
修改近裁剪面的距离,物体成像位置以及大小都不变
通过vp矩阵,转到clip空间后,物件在近裁剪面处此时的w分量恰好位near值
计算光照可以放在vertex或者fragment中,fragment就是光栅化片元,内部数据以及根据重心坐标做过插值(思考渲染时只要想象顶点的数据如何做渲染,并不需要过分考虑片元的渲染)。后处理中根据深度重建世界坐标的做法也仅仅是计算近裁剪面四个顶点的射线,fragment中自动做插值,得到view pace中的射线