2.1综述
目的:生成或渲染一张二维纹理
好处:提高单位时间生产量,但是决定生产速度的是最慢的工序所需要的时间
应用
准备场景数据
粗粒度剔除,剔除不可见物体
设置渲染状态
渲染图元传递到几何阶段
几何
逐顶点,逐多边形操作,顶点坐标变换到屏幕空间
光栅化
对上一阶段的逐顶点数据进行插值,然后进行逐像素处理
2.2 CPU GPU之间的通讯
应用阶段(CPU上)
(1)数据加载到显存
硬盘(HDD)-- >系统内存(RAM)–>显存(VRAM)(显卡对于显存访问速度更快)
(2)设置渲染状态
定义网格怎样被渲染(着色器?光源?材质?)不设置则所有网格将使用同一渲染状态
(3)调用DrawCall
一个CPU发起GPU接收的命令,指向一个需要被渲染的图元,不包含上一阶段完成过的材质信息
2.3 GPU流水线
GPU流水线
顶点着色器:流水线第一个阶段,输入来自CPU,处理单位顶点,每个顶点调用一次。
主要工作:坐标变换,逐顶点光照
坐标变换:把顶点坐标从模型空间转换到齐次裁剪空间,最终得到归一化的设备坐标(NDC)
o.pos=mul(UNITY_MVP,v.position)
裁剪:完全在视野内的图元直接传递,对部分在视野内的图元进行处理。,在其视野外部的部分由新的顶点代替,在外部的顶点丢弃。将部分视野内的图元裁剪到单位立方体内,丢弃原来在正方体外部的顶点。
不可编程,硬件处理
屏幕映射:把图元x,y坐标转换到屏幕坐标系下(二维,与显示画面分辨率 有关),不处理z坐标
幕坐标系+z坐标=窗口坐标系 传递到光栅化阶段、
屏幕映射得到的图标决定了这个顶点对应屏幕上哪个像素及距离这个像素多远。
三角形设置:光栅化第一个流水线阶段,计算光栅化一个三角形网格所需时信息,得到整个三角网格对像素的覆盖情况(三角形边界信息)。
三角形遍历/扫描变换:检查每个像素是否被一个片元覆盖,覆盖则生成片元。输出片元序列,片元——包含很多状态的集合(屏幕坐标,深度信息,法线,纹理坐标等)。
片元着色器:输入上一个阶段对顶点信息插值得到的结果,输出一个或者多个颜色值,仅可以影响单个片元
逐片元操作 :输出合并阶段
决定片元可见性
把通过的颜色值和已经存储在缓冲区的颜色进行合并
写入缓冲区
片元–>模板测试 -->深度测试 -->混合 -->颜色缓冲区
模板测试:读取模板缓冲区中该片元位置的模板值,将该值和读取到的参考值进行比较
深度测试:把该片元与已经存在深度缓冲的深度值进行比较
通过测试:颜色缓冲–>不透明物体–>直接覆盖
–>透明物体–>混合操作
Early-Z:提高性能(目的)–>部分深度测试提前进行–>可能与片元shader冲突->GPU提前判断是否冲突–>有冲突则禁用提前测试(但更多片元要处理,透明度测试会导致性能下降的原因)
双重缓冲:避免看到正在进行光栅化的图示 ,保证看到的图像连续
场景渲染——后置缓冲
场景被渲染到后置缓冲之后,GPU交换前后置缓冲区内容。
前置缓冲:之前显示在屏幕的图像
2.4
GLSL:跨平台性,显卡驱动完成着色,以来硬件,编译结果取决于硬件供应商,不同供应商编译结果可能不同
HLSL:微软控制
DrawCall:CPU调用图像编程接口
CPU和GPU如何实现并行工作:命令缓冲区,CPU添加命令,GPU读取,过程相互独立。
DrawCall过多影响帧率:每次调用DrawCall前CPU需要向GPU发送很多内容。DrawCall过多,CPU花费大量时间提交DrawCall,CPU过载。
减少DrawCall:批处理,小DrawCall合并为大DrawCall
减少DrawCall开销:避免使用大量很小的网格;避免使用过多材质,尽量在不同网格间共用同一材质
shader:GPU渲染的一个阶段
着色器:控制流水线渲染细节
1646

被折叠的 条评论
为什么被折叠?



