找回密码
 立即注册
查看: 179|回复: 0

[简易教程] 【unity Shader 菜鸡教程】4-1 帧缓冲区

[复制链接]
发表于 2022-9-21 17:23 | 显示全部楼层 |阅读模式
帧缓冲区也叫帧缓存,是用于存放一帧中数据信息的容器。
游戏中常说的fps,也就是帧数,比如30/60帧,表示1秒需要绘制画面30/60次,次数越高,画面越流畅。


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


帧缓冲区包括:

  • 颜色缓冲区
  • 深度缓冲区
  • 模板缓冲区
  • 自定义缓冲区
颜色缓冲区
用于存储每帧颜色信息的缓冲区
每个像素颜色由RGB组成,常见的是 ([0-255],[0-255],[0-255]),即 (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)。当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,从而确定像素的遮挡关系,保证渲染正确,决定片段哪些像素点数据可以替换到颜色缓冲区中。
模板缓冲区
模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值,这个数值通常为[0-255]。通过修改、设置、对比这个模板值,可以保存或者丢弃像素。
ShaderLab:模板 - Unity 手册
看着其实很拗口,后续结合具体例子解析。比如遮罩效果。

参考:
[Unity Shader学习笔记] Unity缓冲区
OpenGL单缓冲与双缓冲的区别-腾讯游戏学堂
刘喆:Unity Shader 模板测试(Stencil)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-8 02:05 , Processed in 0.128990 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表