资源大湿 发表于 2022-9-21 17:23

【unity Shader 菜鸡教程】4-1 帧缓冲区

帧缓冲区也叫帧缓存,是用于存放一帧中数据信息的容器。
游戏中常说的fps,也就是帧数,比如30/60帧,表示1秒需要绘制画面30/60次,次数越高,画面越流畅。


片断着色器在写入帧缓冲之前会进行一系列测试:Alpha测试、模板测试、深度测试…,这些测试决定当前像素是否需要写入帧缓冲。
片断着色器在写入帧缓冲之时,会进行一些运算操作:混合
帧缓冲有两种方式,单缓冲和双缓冲。
单缓冲,实际上就是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你回到屏幕的闪烁。
双缓冲,实际上的绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。


帧缓冲区包括:

[*]颜色缓冲区
[*]深度缓冲区
[*]模板缓冲区
[*]自定义缓冲区
颜色缓冲区
用于存储每帧颜色信息的缓冲区
每个像素颜色由RGB组成,常见的是 (,,),即 (2^8,2^8,2^8),也就是 (8bit,8bit,8bit),1个bit表示0或1。
转换
1 bit = 0 或 1
2 bit = 2^2 = 4
8 bit = 2^8 = 256(1 byte 也就是1个字节)
16 bit = 2^16 = 65536 (64k色,2byte )
24 bit = 2^24 = 16777216 (24位真彩色,3byte) 存储大小
1 kb = 1024 byte
1 Mb = 1024 kb
假设一张 1920 * 1080 的 24 位图片,则占用显存为
1920 * 1080 * 3 byte / 1024 /1024 = 5.93 Mb清除缓冲
在unity中,通过修改相机的 Clear Flags 可以设置是否清除缓冲。不清除缓冲的情况下移动物体,会发现在屏幕上残留拖影。


在unity中,内部通过 Clear(color + Z + stencil) 来清理缓冲。
Frame Debugger


通过 Frame Debugger 面板,我们可以观察到场景内物体的渲染顺序、合批等细节



深度缓冲区
存储的是每个像素的深度值,通过深度缓冲区,我们可以进行深度测试(ZTest)。当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,从而确定像素的遮挡关系,保证渲染正确,决定片段哪些像素点数据可以替换到颜色缓冲区中。
模板缓冲区
模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值,这个数值通常为。通过修改、设置、对比这个模板值,可以保存或者丢弃像素。
ShaderLab:模板 - Unity 手册
看着其实很拗口,后续结合具体例子解析。比如遮罩效果。

参考:
Unity缓冲区
OpenGL单缓冲与双缓冲的区别-腾讯游戏学堂
刘喆:Unity Shader 模板测试(Stencil)
页: [1]
查看完整版本: 【unity Shader 菜鸡教程】4-1 帧缓冲区