ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

[TA] 百人计划-图形3.1-深度与模版测试笔记

[TA] 百人计划-图形3.1-深度与模版测试笔记 目录一、 模版测试1.1 模版测试的原理1.2 模版测试核心配置1.3 应用二、深度测试2.1 深度测试原理2.2 基础概念2.2.1 Early-Z2.2.2 ZTest比较操作2.2.3 深度缓冲区2.2.4 ZWrite深度写入2.2.5 渲染队列2.3 深度值特性2.4 深度测试核心配置2.5 深度测试应用2.6 总结参考资料一、 模版测试1.1 模版测试的原理模版缓冲区每个像素存储1个8位无符号整数范围0-255 默认值0原理当前片元参考值与模版缓冲区指定值比较通过保留片元否则丢弃1输出原本颜色0不输出从渲染管线理解图中流程均在frag之后frag阶段高度可配置但无法编程stencil test位置alpha测试之后深度测试之前其他阶段说明Pixel OwnerShip Test像素权测试在scene、game视图里的可视像素Scissor Test裁剪测试自定义渲染区域Alpha Clip按照阈值剔除半透明区域即alpha低于如0.7都被剔除常用场景传送门里面是另一个房间场景也可以用另一个相机拍RT参考游戏《笼中窥梦》1.2 模版测试核心配置配置项功能说明Ref参考值自定义0-255的数值用于和模板缓冲区值做比较Read Mask读掩码与参考值、模板缓冲区值做按位与运算后再进行比较Write Mask写掩码控制模板缓冲区可写入的位范围Comp比较操作可选Never、Less、LEqual、Equal、NotEqual、Greater、GEqual、Always共8种规则Pass模板测试通过时对模板缓冲区执行的操作Fail模板测试失败时对模板缓冲区执行的操作ZFail模板测试通过但深度测试失败时对模板缓冲区执行的操作Color Mask颜色遮罩设为0时不输出任何颜色仅用于更新模板缓冲区1.3 应用思路外界、边界、内界即渲染物体-渲染mask-渲染被mask遮罩的物体3d卡牌效果卡牌呈现纵深3d感随视角变化卡牌内也有视差变化原来的完整场景将卡牌边框外的东西都剔除多面盒子描边反射阴影体蒙版二、深度测试2.1 深度测试原理原理通过深度缓冲区判断片元的前后遮挡关系针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点将像素自身深度值与当前像素点缓冲的像素点比较若通过本对象的像素点才将颜色写入颜色缓冲否则不写入。位置模版测试之后、alpha混合之前深度缓冲区存储每个像素深度值精度为24位高端显卡支持32位深度测试的发展早期算法画家算法从远往近层层覆盖会产生大量overdraw与现在相反被淘汰、Z-Buffer算法通过深度缓冲区存储像素深度值自动比较前后关系当前主流方案-控制Z-Buffer对深度值的存储ZTest、ZWrite-控制不同类型物体的渲染顺序渲染队列透明、不透明物体-减少overdrawEarly-Z、Z-cull、Z-check2.2 基础概念2.2.1 Early-Z定义frag前进行深度测试直接丢弃未通过测试的面片降低无效片元在frag的计算位置光栅化后、frag之前注意有时候会用到两次深度测试Early-Z一次、FS处理后ZTest再进行一次起到检查作用前次Z-Cull后次Z-Check2.2.2 ZTest比较操作ZTest 状态描述Greater深度大于当前缓存则通过LEqual深度小于等于当前缓存则通过Less深度小于当前缓存则通过GEqual深度大于等于当前缓存则通过Equal深度等于当前缓存则通过NotEqual深度不等于当前缓存则通过AlwaysOff深度不论如何都通过Never深度不论如何都不通过2.2.3 深度缓冲区定义类似颜色缓冲(储存所有的像素颜色每个像素存储信息。跟颜色缓冲一样有宽度和高度。深度缓冲是由窗口系统自动创信息它会以16、24或32位float的形式诸存它的深度值。在大部分的系统中深度缓冲的精度都是24位z-buffer里存储当前深度信息2.2.4 ZWrite深度写入深度写入包括两种状态ZWrite On与ZWrite Off先ZTest、再ZWriteZTest读深度缓冲拿当前片元 Z 和缓冲里已存 ZZWrite写深度缓冲把本片元的 Z 存进去只有测试成功才会执行写操作ZTest分为通过和不通过两种情况ZWrite分为开启和关闭两种情况的话一共就是四种情况序号状态组合结果1深度测试通过深度写入开启写入深度缓冲区写入颜色缓冲区2深度测试通过深度写入关闭不写深度缓冲区写入颜色缓冲区3深度测试失败不写深度缓冲区不写颜色缓冲区渲染呈现ZWrite On渲染队列AlwaysLEqual越靠前越先渲染ZWrite Off不写入深度被后来者覆盖除非渲染队列更大←——————相机前方—————— 相机位置 —————相机后方————→ -10 -5 0 5 10 方块B 方块A 相机-1,1-0,1 方块a更近覆盖bpsshader中默认状态是ZTest LEqual、ZWrite On2.2.5 渲染队列内置渲染队列介绍队列数越小越先渲染队列数越大越后渲染。队列名称队列号描述Background1000最早被渲染的物体的队列Geometry2000不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染也是Unity Shader中默认的渲染队列AlphaTest2450有透明通道需要进行Alpha Test的物体的队列比在Geometry中更有效Transparent3000半透物体的渲染队列。一般是不写深度的物体Alpha Blend等的在该队列渲染Overlay4000最后被渲染的物体的队列一般是覆盖效果比如镜头光晕屏幕贴片之类的设置位置Shader代码中设置Tags { Queue Transparent }默认是GeometryShader / Material 的 Inspector面板可以查看Render Queue相关属性在此处设置会覆盖shader里的设置物体渲染顺序规则不透明物体的渲染顺序从前往后透明物体的渲染顺序从后往前OverDraw2.3 深度值特性深度缓冲区存储0-1之间非线性缓冲值因为在适应透视相机的投影阶段viewport视椎体-前后裁剪面一致大小的面此时深度值映射变为非线性近处深度值间间隔宽越远越密集想象人眼看通向远处的树利用有限的缓冲区精度近平面分配高精度、远平面分配低精度近清晰、远模糊ps时刻结合生活中真实的视觉效果理解空间变化模型空间无深度-世界空间线性,z-视空间线性获取场景内线性深度就是转到这一步,z-裁剪空间线性MPerspectivezA·z B-NDC非线性z/w-屏幕空间深度冲突Z-Fighting两个平面极近平行时深度缓冲区精度不足导致导致前后像素频繁切换造成画面频闪解决. 物理上拉开物体之间距离调远摄像机近平面提高近处深度精度使用更高精度的32位缓冲区2.4 深度测试核心配置核心配置两项(1)Unity内置渲染队列队列号越小越先渲染队列名称队列号适用场景渲染顺序规则Background1000背景-Geometry2000不透明物体从前往后渲染减少OverdrawAlphaTest2450透明度测试物体-Transparent3000半透明物体从后往前渲染保证混合效果正确Overlay4000镜头光晕、屏幕贴片等覆盖效果-(2)ZTest与ZWrite组合序号状态组合结果1深度测试通过深度写入开启写入深度缓冲区写入颜色缓冲区2深度测试通过深度写入关闭不写深度缓冲区写入颜色缓冲区3深度测试失败不写深度缓冲区不写颜色缓冲区举例被遮挡物体的显示Greater,ABC, 深度:ABC如果B要展示在A之上Pass 0 正常绘制 ZTestLequal ZWriteOnPass 1 被遮挡发光 ZTestGreater ZWriteOff被遮挡部分通过测试绘制在A上如果背景深度是无穷远不通过露出部分不绘制不写入深度他后面的物体还是Lequal都大于这个深度无法正确绘制在屏幕上适用场景被建筑物等遮挡时人物依然有轮廓显示注意(1)Queue是SubShader 标签Pass没有独立生效的渲染队列。材质的渲染队列默认使用inspector里设置的会覆盖shader的队列设置(2)透明混合的pass出现在不透明阶段原因材质队列2000某pass使用Blend SrcAlpha OneMinusSrcAlpha混合(3)URP下所有Pass无法保证按顺序书写UPR根据渲染阶段LightMode管线绘制安排pass不会默认把shader内所有pass都执行会执行的pass① 标准用途LightMode为以下都会执行LightMode用途UniversalForward前向渲染路径中绘制物体UniversalForwardOnly始终以前向方式绘制兼容前向和延迟 RendererUniversalGBuffer延迟渲染时写入 GBufferSRPDefaultUnlit未设置LightMode时的默认值也用于额外绘制如描边ShadowCaster写入阴影贴图让物体投射阴影DepthOnly深度预通过输出相机视角的深度DepthNormalsOnly深度与法线预通过配合 SSAO 等功能Universal2D供 2D Renderer 使用Meta光照贴图烘焙时提取材质信息② 相同LightMode默认只执行第一个匹配项③ 其他pass要自己设置renderer feature④没写LightMode的 Pass 会被视为SRPDefaultUnlit不是任意数量的无标签 Pass 都会自动执行2.5 深度测试应用基于深度着色水体渲染比较跟水底的深度做颜色渐变阴影贴图比较灯光空间和视空间的深度差透明物体、粒子渲染透掉黑底角色遮挡透视效果能量罩切边效果2.6 总结深度缓冲重要的两个值当前深度缓冲值ZBufferValue与深度参考值rederenceValue通过比较抉择是否更换深度缓冲值Early-Z能节省开销提前抛弃会造成overdraw的无效片元深度测试通过ZTest、ZWrite完成控制如半透明、透明的渲染深度缓冲区存储的是0-1范围内的浮点非线性深度渲染顺序先渲染不透明物体从前往后再渲染透明物体从后往前如有错漏欢迎指正参考资料1.【【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例】 https://www.bilibili.com/video/BV1Tb4y1C7Qa/?share_sourcecopy_webvd_sourceffa9f839ea8afb4bd7809dfc7ae336f8
返回列表