尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

IMR 有深度缓冲,为什么还做不到 HSR?——“画对了“≠“没白画“

IMR 有深度缓冲,为什么还做不到 HSR?——“画对了“≠“没白画“ 开场一个直击要害的反问小王听完上一讲立刻反问“等等IMR立即渲染**明明有深度缓冲Z-Buffer**啊深度测试不就是判断’谁在前谁在后’吗那它不就能剔除被遮挡的了为什么说它做不到 HSR”老鸟竖起大拇指“这个问题问得太到位了关键在于——深度缓冲能让你’画对’但阻止不了你’白画’。HSR 要的不是’画对’是’从头到尾不白画一次’” 第一幕先分清两个概念——“画对vs白画”深度测试解决的是画对深度缓冲(Z-Buffer)的职责 保证最终画面前后关系正确 ↓ 近的挡住远的显示正确 ↓ 这叫画对了! ✓但画对不代表没浪费问题在于 深度测试可能是上完色才发现被挡 ↓ 色都上了然后被判定你在后面丢弃 ↓ 画面是对的但那次上色白干了! ↓ 这就是画对了但白画了生动比喻刷墙的两种境界画对 最后墙是正确的颜色 白画 中途刷了又被盖住的浪费 深度测试 保证最后颜色对(画对) 但不管你中途刷了多少层(可能白画) HSR 既保证颜色对又保证一层都不白刷 ↓ 深度测试管结果对 HSR管过程不浪费 第二幕深度测试的时机问题——“事后诸葛亮”标准深度测试在上色之后IMR标准渲染管线顺序 三角形 → 光栅化 → 片元着色器(上色!) → 深度测试 → 输出 ↑ ↑ 先上色 后比深度 ↓ 上完色才比深度发现被挡就丢 → 那次上色白干了!图解白干过程场景先画后面的箱子再画前面的墙 第1步画箱子 光栅化 → 上色(算光照贴图...) → 写入深度 箱子显示了✓ 第2步画墙(在箱子前面) 光栅化 → 上色 → 深度测试 墙更近通过 → 覆盖箱子 墙显示了✓ 结果画面对(只看到墙)✓ 但是箱子的上色完全白做了! ✗ (被墙盖住了那次计算浪费)关键深度测试太晚了标准深度测试的问题 它在片元着色器之后 ↓ 等于上色都做完了才发现白做 ↓ 深度测试保证了画面对 但没省下那次浪费的上色 ↓ 这就是为什么有深度≠有HSR 第三幕Early-Z 的补救与局限IMR 的改进Early-Z提前深度测试IMR意识到上色后测试太浪费 ↓ 搞出Early-Z把深度测试提到上色前 新顺序 三角形 → 光栅化 → Early-Z(先比深度!) → 上色 → 输出 ↑ 上色前就比深度 被挡的直接跳过上色Early-Z 确实能省但有前提Early-Z生效的前提 被挡的三角形绘制时它前面的东西 已经在深度缓冲里了 ↓ 也就是说要先画前面的后画后面的 ↓ 顺序对了Early-Z才能剔除致命局限依赖绘制顺序❌ 如果顺序反了(先画后面再画前面) 第1步先画箱子(后面的) Early-Z: 深度缓冲空的没东西挡它 → 通过上色! (箱子上色了) 第2步再画墙(前面的) Early-Z: 比箱子近通过 → 上色覆盖箱子 结果箱子还是白上色了! ↓ 因为画箱子时墙还没画 Early-Z不知道箱子会被挡生动理解 Early-Z 的赌博性Early-Z像赌绘制顺序 如果你先画近的(墙) 再画远的(箱子)时 Early-Z发现你被墙挡了 → 跳过 ✓ 赚了! 如果你先画远的(箱子) 画箱子时墙还没来 Early-Z不知道会被挡 → 上色 ✗ 亏了! ↓ 赢不赢看你绘制顺序对不对 ↓ 这就是Early-Z不完美的根源 第四幕HSR 凭什么稳赢——不赌顺序HSR 的必杀技攒齐再比HSR(TBDR)不赌顺序因为它攒齐了! 回顾上一讲 TBDR先把一个Tile的所有三角形攒齐 ↓ 攒齐后无论你什么顺序提交的 HSR都能纵览全局: 这个像素箱子和墙都在墙最近 ↓ 直接只给墙上色箱子根本不上色 ↓ 无论顺序如何稳赢! ✓三者对比核心差异标准深度测试 上色 → 比深度 → 丢弃 (白上色了纯浪费) Early-Z 比深度 → 上色 (能省但依赖绘制顺序可能赌输) HSR 攒齐所有 → 全局比出最前 → 只给最前上色 (不依赖顺序稳赢零浪费)为什么 IMR 做不到 HSR 的稳赢IMR是流式处理画一个才知道一个 ↓ 画当前三角形时不知道后面还有啥 ↓ 只能靠已经画的(深度缓冲)来赌 ↓ 赌顺序 Early-Z 不完美 ↓ 无法像HSR那样攒齐全局稳赢 第五幕一表看清深度相关技术深度技术全对比技术 时机 能否省上色 依赖顺序 完美? ────────────────────────────────────────────────── 标准深度测试 上色后 不能省 - 画对但浪费 Early-Z 上色前 能省 依赖! 不完美 HSR 攒齐后 能省 不依赖 完美!关键区别一句话标准深度测试管画对不管白画 Early-Z想省白画但要赌顺序 HSR省白画且不用赌稳赢核心洞察有深度缓冲 ≠ 能高效剔除遮挡 深度缓冲人人都有(保证画对) 但上色前就精准剔除(HSR) 需要攒齐全局的能力 ↓ 这个能力只有TBDR有 IMR只能用Early-Z赌一把️ 第六幕这对开发有什么实际意义IMR 平台手动排序很重要在IMR(桌面)上为了让Early-Z生效 ✅ 不透明物体从前往后画 (先画近的让Early-Z剔除远的) Unity的不透明队列大致这么做 或者用Z-Prepass 先只画深度(不上色)建立完整深度缓冲 再正式上色时Early-Z就能完美剔除了 ↓ 用一次纯深度绘制换来后续精准剔除TBDR 平台不用操心顺序在TBDR(移动)上 HSR自动搞定不依赖顺序 ↓ 不透明物体的Overdraw基本免费消除 ↓ 你不用手动排序也高效 (但透明物体仍要注意HSR管不了透明)Z-PrepassIMR 模拟 HSR 的手段既然IMR做不到HSR能模拟吗? 能! 用Z-Prepass: 第1遍只画深度不上色(便宜) 建立完整的深度缓冲 第2遍正式渲染 此时深度缓冲已完整 Early-Z能完美剔除被挡的 ↓ 效果接近HSR但要画两遍几何 ↓ 用多一遍深度绘制换精准剔除✅ 理解检查清单概念澄清 □ 明白深度测试管画对不管白画 □ 明白画对了不等于没浪费 □ 明白标准深度测试在上色之后 Early-Z □ 明白Early-Z把测试提到上色前 □ 明白Early-Z依赖绘制顺序 □ 明白顺序反了Early-Z会失效 HSR对比 □ 明白HSR靠攒齐实现不依赖顺序 □ 明白IMR流式处理无法攒齐 □ 明白这就是IMR做不到HSR的根源 实践 □ 知道IMR要手动排序或Z-Prepass □ 知道TBDR不用操心顺序(HSR自动) 一句话总结IMR 有深度缓冲为什么还做不到 HSR核心答案深度缓冲只保证画对前后关系正确但阻止不了白画被挡的可能已经上完色才被丢弃。IMR 的改进版 Early-Z 虽能上色前剔除但它是流式处理画当前三角形时看不到后面只能靠已画的深度赌绘制顺序——顺序反了就失效。而 HSR 靠 TBDR攒齐全局无论顺序如何都能精准剔除这个攒齐的能力正是流式的 IMR 天生缺失的核心口诀深度管画对不管白画掉Early-Z赌顺序HSR攒齐才稳赢 一图收尾三种境界【标准深度测试】 上色 → 比深度 → 被挡?丢弃 ↓ 钱花了才发现白花(浪费) 但画面对✓ 【Early-Z(IMR最优)】 比深度 → 没被挡?上色 ↓ 先看再花钱(想省) 但依赖顺序可能赌输 【HSR(TBDR)】 攒齐全部 → 全局选最前 → 只给它上色 ↓ 看清全局才花钱(稳省) 不赌顺序完美! 一句话记住本质深度缓冲是结果的裁判HSR 是过程的规划师。裁判能判你赢但省不了你比赛中的力气规划师让你从头到尾不费一分冤枉力。IMR 只有裁判会赌的 Early-ZTBDR 有真正的规划师HSR 延伸对比为什么这个区别如此重要【一个像素被5层遮挡的场景】 标准深度测试(最坏) 5层全上色 → 逐个比深度 → 留最前1个 浪费了4次上色! Early-Z(顺序好时) 从前往后画 → 后4层被剔除 只上色1次 ✓ (但需顺序配合) Early-Z(顺序坏时) 从后往前画 → 可能5次都上色 和标准测试一样浪费 HSR 攒齐5层 → 直接选最前 → 只上色1次 无论顺序永远只浪费0次! ↓ 这就是移动端HSR的威力 Overdraw再严重也不怕
返回列表