渲染流水线
2017-05-15 17:13:42 0 举报
AI智能生成
登录查看完整内容
渲染流水线
作者其他创作
大纲/内容
渲染流水线
CPU和GPU之间的通信
Application Stage应用阶段
把数据加载到显存中
数据包括:网格、纹理、顶点位置、法线、顶点颜色、纹理坐标等
HDD -> RAM -> VRAM
设置渲染状态
渲染状态:定义了场景中的网格是怎样被渲染的
使用哪张纹理,使用那个shader,光源属性等
调用Draw Call
发起方:CPU,接收方:GPU
指向本次需要被渲染的图元(primitives)列表
GPU开始渲染过程
GPU流水线
Geometry Stage几何阶段
顶点数据
应用阶段加载到显存中 -> 由Draw Call指定 -> 传给顶点着色器
Vertex Shader顶点着色器
可编程
每个输入的顶点都会调用一次
并行处理,无法得到顶点之间的关系
内容
坐标变换
顶点坐标变换(模拟水纹,布料)
顶点坐标:模型空间 -> 齐次裁剪空间 -> 归一化的设备坐标(Normalized Device Coordinates,NDC)
顶点着色
逐顶点光照计算
顶点颜色赋值
Tessellation Shader曲面细分着色器
可选
细分图元
Geometry Shader几何着色器
逐图元(Per-Primitive)着色
或用于产生更多的图元
Clipping裁剪
不可编程,可配置
摄像机视野范围外的图元不需要被处理
图元和摄像机的三种关系
完全在视野内
继续传递给下一个流水线阶段
部分在视野内
裁剪:生成新的顶点,在图元和视野边界的交点处
完全在视野外
舍弃
Screen Mapping屏幕映射
不可编程,不可配置
输入:三维坐标系下的坐标(范围在单位立方体内)
将图元的x和y坐标映射到屏幕坐标系(Screen Coordinates)
屏幕坐标系和z坐标一起构成了窗口坐标系(Window Coordinates),z值表示离屏幕的远近
Rasterizer Stage光栅化阶段
Triangle Setup三角形设置
计算光栅化一个三角形网格需要的信息(每条边上的像素坐标)
Triangle Traversal三角形遍历
检查每个像素是否被一个三角网格所覆盖,如果被覆盖的话,就会生成一个片元(fragment)
使用三角形网格的顶点信息对整个覆盖区域的像素进行插值
输出:片元序列
片元不是真正意义上的像素,是包含了很多状态(屏幕坐标,深度信息,法线,纹理)的集合,用于计算每个像素的最终颜色
Fragment Shader片元着色器
纹理采样
逐像素光照计算
并行计算,无法获取片元之间的关系
Per-Fragment Operations逐片元操作
决定每个片元的可见性
模板测试
读取模板缓冲区的值与参考值进行比较
未通过测试舍弃片元
不管是否通过测试,都可以根据比较结果修改模板缓冲区的值
深度测试
将片元深度值与深度缓冲区的值进行比较
通过深度测试
开启深度写入
更改深度缓冲区的值
关闭深度写入
无法更改深度缓冲区的值
未通过测试
舍弃片元
不管深度写入是否开启,都无法更改深度缓冲区的值
颜色合并
将片元颜色值与颜色缓冲区中的值进行合并
开启混合
将片元颜色值与寒色缓冲区的值进行混合操作,存入颜色缓冲区中
未开启混合
将片元颜色值覆盖到颜色缓冲区中
Unity中深度测试在片元着色器之前
Early-Z
提高效率,深度测试不通过的片元不需要在片元着色器中进行计算
双重缓冲(Double-Buffering)
屏幕上显示的颜色就是颜色缓冲区的值
对场景的缓冲在后置缓冲中(Back Buffering)
屏幕显示前置缓冲(Front Buffering)中的颜色
后置缓冲完成渲染后,GPU交互前置缓冲和后置缓冲中的内容
0 条评论
回复 删除
下一页