2023-06-18 23:16:41 +08:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="zh-CN">
|
|
|
|
|
<head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#">
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
|
|
|
|
|
<meta name="generator" content="Hugo 0.113.0"><meta name="theme-color" content="#fff" />
|
|
|
|
|
<meta name="color-scheme" content="light dark">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
|
|
|
|
|
|
<meta name="format-detection" content="telephone=no, date=no, address=no, email=no" />
|
|
|
|
|
|
|
|
|
|
<meta http-equiv="Cache-Control" content="no-transform" />
|
|
|
|
|
|
|
|
|
|
<meta http-equiv="Cache-Control" content="no-siteapp" />
|
|
|
|
|
|
|
|
|
|
<title>TAA(temporal antialiasing) | 飞鸿踏雪</title>
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="/css/meme.min.12a3541920a798d49c1bca858f15c53090f14ce9367a34faa2bb51dd38299730.css"/>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script src="/js/meme.min.ac2b48f322cff6a9a8036be3baf3e59e300cd9e4191997a8c3765f79de02bf8d.js"></script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,500;0,700;1,400;1,700&family=Noto+Serif+SC:wght@400;500;700&family=Source+Code+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" media="print" onload="this.media='all'" />
|
|
|
|
|
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,500;0,700;1,400;1,700&family=Noto+Serif+SC:wght@400;500;700&family=Source+Code+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" /></noscript>
|
|
|
|
|
|
|
|
|
|
<meta name="author" content="InkSoul" /><meta name="description" content="知识沉淀有限,后续会补充内容 当前内容来源: [SIGGRAPH 2016] Temporal Antialiasing in Uncharted 4 十分感谢浅墨大佬的整理 基本思……" />
|
|
|
|
|
|
|
|
|
|
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
|
|
|
|
|
<link rel="mask-icon" href="/icons/safari-pinned-tab.svg" color="#2a6df4" />
|
|
|
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png" />
|
|
|
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
|
|
|
<meta name="apple-mobile-web-app-title" content="飞鸿踏雪" />
|
|
|
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
|
|
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
|
|
|
<meta name="application-name" content="飞鸿踏雪" />
|
|
|
|
|
<meta name="msapplication-starturl" content="../../" />
|
|
|
|
|
<meta name="msapplication-TileColor" content="#fff" />
|
|
|
|
|
<meta name="msapplication-TileImage" content="../../icons/mstile-150x150.png" />
|
|
|
|
|
<link rel="manifest" href="/manifest.json" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="canonical" href="http://www.inksoul.top/computergraphic/taa/" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script type="application/ld+json">
|
|
|
|
|
{
|
|
|
|
|
"@context": "https://schema.org",
|
|
|
|
|
"@type": "BlogPosting",
|
|
|
|
|
"datePublished": "2022-05-15T17:55:10+08:00",
|
|
|
|
|
"dateModified": "2023-06-18T21:19:01+08:00",
|
|
|
|
|
"url": "http://www.inksoul.top/computergraphic/taa/",
|
|
|
|
|
"headline": "TAA(temporal antialiasing)",
|
|
|
|
|
"description": "知识沉淀有限,后续会补充内容 当前内容来源: [SIGGRAPH 2016] Temporal Antialiasing in Uncharted 4 十分感谢浅墨大佬的整理 基本思……",
|
|
|
|
|
"inLanguage" : "zh-CN",
|
|
|
|
|
"articleSection": "computergraphic",
|
|
|
|
|
"wordCount": 2548 ,
|
|
|
|
|
"image": ["http://www.inksoul.top/../../images/Halton_sequence.png","http://www.inksoul.top/../../images/offset_projection_matrix.png","http://www.inksoul.top/../../images/revealed_piels_appear_bad.png","http://www.inksoul.top/../../images/one_pixel_thick_ghosting.png"],
|
|
|
|
|
"author": {
|
|
|
|
|
"@type": "Person",
|
|
|
|
|
"email": "qingci30@163.com",
|
|
|
|
|
"image": "http://www.inksoul.top/icons/apple-touch-icon.png",
|
|
|
|
|
"url": "http://www.inksoul.top",
|
|
|
|
|
"name": "InkSoul"
|
|
|
|
|
},
|
|
|
|
|
"license": "[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)",
|
|
|
|
|
"publisher": {
|
|
|
|
|
"@type": "Organization",
|
|
|
|
|
"name": "飞鸿踏雪",
|
|
|
|
|
"logo": {
|
|
|
|
|
"@type": "ImageObject",
|
|
|
|
|
"url": "http://www.inksoul.top/icons/apple-touch-icon.png"
|
|
|
|
|
},
|
|
|
|
|
"url": "http://www.inksoul.top/"
|
|
|
|
|
},
|
|
|
|
|
"mainEntityOfPage": {
|
|
|
|
|
"@type": "WebSite",
|
|
|
|
|
"@id": "http://www.inksoul.top/"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<meta property="og:title" content="TAA(temporal antialiasing)" />
|
|
|
|
|
<meta property="og:description" content="知识沉淀有限,后续会补充内容 当前内容来源: [SIGGRAPH 2016] Temporal Antialiasing in Uncharted 4 十分感谢浅墨大佬的整理 基本思……" />
|
|
|
|
|
<meta property="og:url" content="http://www.inksoul.top/computergraphic/taa/" />
|
|
|
|
|
<meta property="og:site_name" content="飞鸿踏雪" />
|
|
|
|
|
<meta property="og:locale" content="zh" /><meta property="og:image" content="http://www.inksoul.top/../../images/Halton_sequence.png" />
|
|
|
|
|
<meta property="og:type" content="article" />
|
|
|
|
|
<meta property="article:published_time" content="2022-05-15T17:55:10+08:00" />
|
|
|
|
|
<meta property="article:modified_time" content="2023-06-18T21:19:01+08:00" />
|
|
|
|
|
|
|
|
|
|
<meta property="article:section" content="computergraphic" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
<div class="container">
|
|
|
|
|
|
|
|
|
|
<header class="header">
|
|
|
|
|
|
|
|
|
|
<div class="header-wrapper">
|
|
|
|
|
<div class="header-inner single">
|
|
|
|
|
|
|
|
|
|
<div class="site-brand">
|
|
|
|
|
|
|
|
|
|
<a href="/" class="brand">飞鸿踏雪</a>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<nav class="nav">
|
|
|
|
|
<ul class="menu" id="menu">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item active"><a href="/computergraphic/"><svg class="icon computergraphic" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"></path></svg><span class="menu-item-name">图形学</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item"><a href="/algorithm/"><svg class="icon algorithm" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path></svg><span class="menu-item-name">算法</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item"><a href="/mathematics/"><svg class="icon mathematics" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path stroker-linecap="round" stroke-linejoin="round" stroker-width="2" d="M576 32.01c0-17.69-14.33-31.1-32-31.1l-224-.0049c-14.69 0-27.48 10-31.05 24.25L197.9 388.3L124.6 241.7C119.2 230.9 108.1 224 96 224L32 224c-17.67 0-32 14.31-32 31.1s14.33 32 32 32h44.22l103.2 206.3c5.469 10.91 16.6 17.68 28.61 17.68c1.172 0 2.323-.0576 3.495-.1826c13.31-1.469 24.31-11.06 27.56-24.06l105.9-423.8H544C561.7 64.01 576 49.7 576 32.01zM566.6 233.4c-12.5-12.5-32.75-12.5-45.25 0L480 274.8l-41.38-41.37c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25l41.38 41.38l-41.38 41.38c-12.5 12.5-12.5 32.75 0 45.25C399.6 412.9 407.8 416 416 416s16.38-3.125 22.62-9.375L480 365.3l41.38 41.38C527.6 412.9 535.8 416 544 416s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25l-41.38-41.38L566.6 278.6C579.1 266.1 579.1 245.9 566.6 233.4z"/></svg><span class="menu-item-name">数学</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item"><a href="/408/"><svg class="icon 408" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticon 408s, Inc. --><path d="M172.1 40.16L268.1 3.76C280.9-1.089 295.1-1.089 307.9 3.76L403.9 40.16C425.6 48.41 440 69.25 440 92.52V204.7C441.3 205.1 442.6 205.5 443.9 205.1L539.9 242.4C561.6 250.6 576 271.5 576 294.7V413.9C576 436.1 562.9 456.2 542.5 465.1L446.5 507.3C432.2 513.7 415.8 513.7 401.5 507.3L288 457.5L174.5 507.3C160.2 513.7 143.8 513.7 129.5 507.3L33.46 465.1C13.13 456.2 0 436.1 0 413.9V294.7C0 271.5 14.39 250.6 36.15 242.4L132.1 205.1C133.4 205.5 134.7 205.1 136 204.7V92.52C136 69.25 150.4 48.41 172.1 40.16V40.16zM290.8 48.64C289 47.95 286.1 47.95 285.2 48.64L206.8 78.35L287.1 109.5L369.2 78.35L290.8 48.64zM392 210.6V121L309.6 152.6V241.8L392 210.6zM154.8 250.9C153 250.2 150.1 250.2 149.2 250.9L70.81 280.6L152 311.7L233.2 280.6L154.8 250.9zM173.6 455.3L256 419.1V323.2L173.6 354.8V455.3zM342.8 280.6L424 311.7L505.2 280.6L426.8 250.9C425 250.2 422.1 250.2 421.2 250.9L342.8 280.6zM528 413.9V323.2L445.6 354.8V455.3L523.2 421.2C526.1 419.9 528 417.1 528 413.9V413.9z"/></svg><span class="menu-item-name">408</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item"><a href="/stuff/"><svg class="icon stuff" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticon stuffs, Inc. --><path d="M216 104C202.8 104 192 114.8 192 128s10.75 24 24 24c79.41 0 144 64.59 144 144C360 309.3 370.8 320 384 320s24-10.75 24-24C408 190.1 321.9 104 216 104zM224 0C206.3 0 192 14.31 192 32s14.33 32 32 32c123.5 0 224 100.5 224 224c0 17.69 14.33 32 32 32s32-14.31 32-32C512 129.2 382.8 0 224 0zM188.9 346l27.37-27.37c2.625 .625 5.059 1.506 7.809 1.506c17.75 0 31.99-14.26 31.99-32c0-17.62-14.24-32.01-31.99-32.01c-17.62 0-31.99 14.38-31.99 32.01c0 2.875 .8099 5.25 1.56 7.875L166.2 323.4L49.37 206.5c-7.25-7.25-20.12-6-24.1 3c-41.75 77.88-29.88 176.7 35.75 242.4c65.62 65.62 164.6 77.5 242.4 35.75c9.125-5 10.38-17.75 3-25L188.9 346z"/></svg><span class="menu-item-name">杂物</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item"><a href="/about/"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" class="icon user-circle"><path d="M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 96c48.6 0 88 39.4 88 88s-39.4 88-88 88-88-39.4-88-88 39.4-88 88-88zm0 344c-58.7 0-111.3-26.6-146.5-68.2 18.8-35.4 55.6-59.8 98.5-59.8 2.4 0 4.8.4 7.1 1.1 13 4.2 26.6 6.9 40.9 6.9 14.3 0 28-2.7 40.9-6.9 2.3-.7 4.7-1.1 7.1-1.1 42.9 0 79.7 24.4 98.5 59.8C359.3 421.4 306.7 448 248 448z"/></svg><span class="menu-item-name">关于</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="menu-item">
|
|
|
|
|
<a id="theme-switcher" href="#"><span class="icon theme-icon-light">🌞</span><span class="icon theme-icon-dark">🌙</span></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<input type="checkbox" id="nav-toggle" aria-hidden="true" />
|
|
|
|
|
<label for="nav-toggle" class="nav-toggle"></label>
|
|
|
|
|
<label for="nav-toggle" class="nav-curtain"></label>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<main class="main single" id="main">
|
|
|
|
|
<div class="main-inner">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<article class="content post h-entry" data-align="justify" data-type="computergraphic" data-toc-num="true">
|
|
|
|
|
|
|
|
|
|
<h1 class="post-title p-name">TAA(temporal antialiasing)</h1>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="post-body e-content">
|
|
|
|
|
<hr>
|
|
|
|
|
<p>知识沉淀有限,后续会补充内容</p>
|
|
|
|
|
<p>当前内容来源:</p>
|
|
|
|
|
<p><a href="https://github.com/QianMo/Real-Time-Rendering-4th-Bibliography-Collection/blob/main/Chapter%201-24/%5B1938%5D%C2%A0%5BSIGGRAPH%202016%5D%20Temporal%20Antialiasing%20in%C2%A0Uncharted%204.pptx" target="_blank" rel="noopener"> [SIGGRAPH 2016] Temporal Antialiasing in Uncharted 4 </a></p>
|
|
|
|
|
<p>十分感谢浅墨大佬的整理</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<h6 id="基本思想"><a href="#基本思想" class="anchor-link"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon anchor-icon"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg></a>基本思想</h6>
|
|
|
|
|
<p>与超采样类似且在静态图片下实现方式相同</p>
|
|
|
|
|
<p>对同一像素点内采用多个采样点的方式来减少走样但将采样点分散到了一段时间内的多个帧上,在每帧采样时对采样点进行偏移,即抖动(jitter)来实现MSAA中放置多个次采样点的效果</p>
|
|
|
|
|
<p>采样序列也使用Halto sequence
|
|
|
|
|
<img src="../../images/Halton_sequence.png" alt=""></p>
|
|
|
|
|
<h6 id="jitter的实现"><a href="#jitter的实现" class="anchor-link"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon anchor-icon"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg></a>jitter的实现</h6>
|
|
|
|
|
<p>采样点的位置会在初始化的时候确定,之后需要在与像素中心距离$[0,1]$的范围里发生偏移</p>
|
|
|
|
|
<p>实现这个效果只需要对投影矩阵中的值进行改动
|
|
|
|
|
<img src="../../images/offset_projection_matrix.png" alt=""></p>
|
|
|
|
|
<p>图片中标红的值便是在归一化后的坐标空间里偏移值的替换位置</p>
|
|
|
|
|
<p>当然,只完成jitter只会让实时渲染的图像发生严重的抖动,接下来我们只需要让这些抖动的帧收敛(converge, PS:实在找不到合适的词来翻译)</p>
|
|
|
|
|
<h6 id="在渲染管线中的位置"><a href="#在渲染管线中的位置" class="anchor-link"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon anchor-icon"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg></a>在渲染管线中的位置</h6>
|
|
|
|
|
<p>TAA Shader</p>
|
|
|
|
|
<p>输入:</p>
|
|
|
|
|
<p>当前帧的HDR缓存
|
|
|
|
|
<br>上一帧的TAA计算结果或者历史结果缓存</p>
|
|
|
|
|
<p>输出:</p>
|
|
|
|
|
<p>当前帧的TAA结果,用于输出到渲染管线的下一处理阶段 和 作为下一帧TAA计算的历史结果缓存</p>
|
|
|
|
|
<p>由此可以推断出TAA Shader在渲染管线的位置</p>
|
|
|
|
|
<p>Depth only pass (main view scene pass)
|
|
|
|
|
<br>GBuffer pass (main view scene pass)
|
|
|
|
|
<br>Deferred lighting shader $\leftarrow$ HDR
|
|
|
|
|
<br>Temporal AA
|
|
|
|
|
<br>Post processing (tone mapping, motion blur, etc.) $\leftarrow$ LDR</p>
|
|
|
|
|
<h6 id="静态场景"><a href="#静态场景" class="anchor-link"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon anchor-icon"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg></a>静态场景</h6>
|
|
|
|
|
<p>在静态场景下应用TAA</p>
|
|
|
|
|
<p>设置好输入和输出
|
|
|
|
|
<br> 启用全屏着色
|
|
|
|
|
<br> 在历史值和现在值之间做插值计算</p>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span><span class="lnt">2
|
|
|
|
|
</span><span class="lnt">3
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-S" data-lang="S"><span class="line"><span class="cl"><span class="n">float3</span> <span class="n">currColor</span> <span class="o">=</span> <span class="nf">currBuffer.Load</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">float3</span> <span class="n">historyColor</span> <span class="o">=</span> <span class="nf">historyBuffer.Load</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">return</span> <span class="nf">lerp</span><span class="p">(</span><span class="n">historyColor</span><span class="p">,</span><span class="n">currColor</span><span class="p">,</span><span class="m">0.05</span><span class="n">f</span><span class="p">);</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><p>插值时,不同的权重会带来不同的影响
|
|
|
|
|
<br>当前帧的颜色的权重越高,抖动越明显,但收敛速度较快
|
|
|
|
|
<br>历史帧的颜色的权重越高,抖动越少,走样越明显,但是收敛速度慢</p>
|
|
|
|
|
<p>0.05是一个合适的权重值来平衡反走样质量与收敛速度,这意味着每一个新渲染的帧都只对最终的静态场景生成占比5%</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<h6 id="动态场景"><a href="#动态场景" class="anchor-link"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon anchor-icon"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg></a>动态场景</h6>
|
|
|
|
|
<p>在动态情况下,我们需要使用全局运动向量来计算当前帧的某一个像素在上一帧的位置坐标</p>
|
|
|
|
|
<p>所以在GBuffer里我们通常作如下计算
|
|
|
|
|
<br>$ pos_{proj}\times mat_{wvp}$
|
|
|
|
|
<br>$ posLast_{proj}=posLast_{obj}\times matLast_{wvp}$</p>
|
|
|
|
|
<p>由此我们可以总结出计算运动向量(Motion Vector)所需的值</p>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>上一帧的相机信息</li>
|
|
|
|
|
<li>每一个物体上一帧的$ mat_{o2w}$</li>
|
|
|
|
|
<li>每一个蒙皮的物体在上一帧时的骨骼位置,并在每一帧计算两次蒙皮和输出上一帧和目前帧的顶点位置</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>当然,在GBuffer里我们可以直接获得目前帧的ndc(normalized device coordinate)坐标,出于不将jitter视为运动的目的,我们也要在ndc里去除jitter带来的偏移</p>
|
|
|
|
|
<p>$ pos_{ndc} -= g_{projOffset} $
|
|
|
|
|
<br>$ posLast_{ndc} -= g_{projOffsetLast} $
|
|
|
|
|
<br>$ float2 \quad motionvector = (posLast_{ndc}- pos_{ndc} ) * float2(0.5f,-0.5f) $</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>对于滚动的贴图(比如流动的单层贴图水)
|
|
|
|
|
<br>我们需要计算贴图在贴图UV里的变化量(deltaU,deltaV)在屏幕空间里造成了多少变化量(deltaX,deltaY)
|
|
|
|
|
<br>deltaU = ddx(U) * deltaX + ddy(U) * deltaY
|
|
|
|
|
<br>deltaV = ddx(V) * deltaX + ddy(V) * deltaY</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>理论上所有物体都应有motion vector,但依旧有某些物体不支持motion vector</p>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>有复杂贴图的动画物体,如粒子烟雾,水流,云的移动</li>
|
|
|
|
|
<li>半透明物体,因为motion vector仅有一层而无法写入</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<p>当然,我们可以选择将它们的绘制顺序调换至TAA之后,但并非所有物体都允许这么做,任何物体在未经TAA处理的情况下都会发生抖动
|
|
|
|
|
<br>纠正抖动并非只是简单地去除,还要用抖动后的深度情况进行检测</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>在对多种情况进行讨论后,我们便可以开始进行motion vector的混合计算,计算前必须去除当前采样的抖动偏移值</p>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span><span class="lnt">2
|
|
|
|
|
</span><span class="lnt">3
|
|
|
|
|
</span><span class="lnt">4
|
|
|
|
|
</span><span class="lnt">5
|
|
|
|
|
</span><span class="lnt">6
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-s" data-lang="s"><span class="line"><span class="cl"><span class="o">//</span>去除抖动偏移值,得到像素中心值
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">uv</span> <span class="o">-=</span> <span class="n">_jitter</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="o">//</span>计算上一帧的投影坐标
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">float2</span> <span class="n">uvLast</span> <span class="o">=</span> <span class="n">uv</span> <span class="o">+</span><span class="nf">motionVectorBuffer.Sample</span><span class="p">(</span><span class="n">point</span><span class="p">,</span><span class="n">uv</span><span class="p">);</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="o">//</span>双线性模式采样
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">float3</span> <span class="n">historyColor</span> <span class="o">=</span> <span class="nf">historyBuffer.Sample</span><span class="p">(</span><span class="n">linear</span><span class="p">,</span><span class="n">uvLast</span><span class="p">);</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><p>镜头移动的时候,很多物体之间的遮挡关系会发生变化,例如</p>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>原本不出现的物体在下一帧出现,原来出现的物体被遮挡而消失</li>
|
|
|
|
|
<li>光线发生了改变,阴影的位置改变或高光位置改变</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<p>这会导致采样motion偏移到的位置在上一帧并没有渲染数据,这时为了数据的平滑过渡,可以在像素点位置周围判断深度,取距离最近的点位来采样获取motion vector的值,减弱遮挡错误的影响</p>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span><span class="lnt">2
|
|
|
|
|
</span><span class="lnt">3
|
|
|
|
|
</span><span class="lnt">4
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-s" data-lang="s"><span class="line"><span class="cl"><span class="o">//</span>通过遍历采样点周围<span class="m">9</span>个像素的方式计算<span class="n">neighborMin</span>和<span class="n">neighborMax</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">float3</span> <span class="n">neighborMin</span><span class="p">,</span><span class="n">neighborMax</span><span class="p">;</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl">
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">historyColor</span> <span class="o">=</span> <span class="nf">clamp</span><span class="p">(</span><span class="n">historyColor</span><span class="p">,</span><span class="n">neighborMin</span><span class="p">,</span><span class="n">neighborMax</span><span class="p">);</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><p>这种方式也存在一些弊端
|
|
|
|
|
<br>对于未发生改变的物体,会截断(clamp out)太多不同的历史颜色值
|
|
|
|
|
<br>$3\times3$的像素点周围采样无法对边缘的反走样生效</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>这种计算方式有时会因 neighborhood min/max的值过大使clamp失效而产生鬼影(ghosting)现象</p>
|
|
|
|
|
<p>解决方法:</p>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>使用模板位( stencil bits , PS:这个我也不好翻译)的方式将物体分割为两个部份</li>
|
|
|
|
|
<li>将目前帧和上一帧的stencil 输入到TAA shader中处理</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span><span class="lnt">2
|
|
|
|
|
</span><span class="lnt">3
|
|
|
|
|
</span><span class="lnt">4
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-s" data-lang="s"><span class="line"><span class="cl"><span class="n">uint</span> <span class="n">currStencil</span> <span class="o">=</span> <span class="nf">stencilBuffer.Sample</span><span class="p">(</span><span class="n">point</span><span class="p">,</span><span class="n">uv</span><span class="p">);</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">uint</span> <span class="n">lastStencil</span> <span class="o">=</span> <span class="nf">lastStencilBuffer.Sample</span><span class="p">(</span><span class="n">point</span><span class="p">,</span><span class="n">uvLast</span><span class="p">);</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">blendFactor</span> <span class="o">=</span> <span class="p">(</span><span class="n">lastStencil</span> <span class="o">&</span> <span class="mh">0x18</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">currStencil</span> <span class="o">&</span> <span class="mh">0x18</span><span class="p">)</span> <span class="o">?</span> <span class="n">blendFactor</span> <span class="o">:</span> <span class="m">1</span><span class="n">.f</span><span class="p">;</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="o">//</span><span class="mh">0x18</span>表示有两个<span class="n">ghosting</span> <span class="nf">bits </span><span class="p">(</span>不好翻译<span class="m">+1</span><span class="p">)</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><p>在经过处理后,鬼影现象消失,但当相机从向右旋转时,人物的左侧边缘像素表现效果较差</p>
|
|
|
|
|
<p><img src="../../images/revealed_piels_appear_bad.png" alt=""></p>
|
|
|
|
|
<p>为了减少这种情况的产生,我们在blendFactor为1时,返回一个经过高斯模糊的上一帧的颜色值</p>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span><span class="lnt">2
|
|
|
|
|
</span><span class="lnt">3
|
|
|
|
|
</span><span class="lnt">4
|
|
|
|
|
</span><span class="lnt">5
|
|
|
|
|
</span><span class="lnt">6
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-s" data-lang="s"><span class="line"><span class="cl"><span class="n">blendFactor</span> <span class="o">=</span> <span class="p">(</span><span class="n">lastStencil</span> <span class="o">&</span> <span class="mh">0x18</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">currStencil</span> <span class="o">&</span> <span class="mh">0x18</span><span class="p">)</span> <span class="o">?</span> <span class="n">blendFactor</span> <span class="o">:</span><span class="m">1</span><span class="n">.f</span><span class="p">;</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl">
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="n">float3</span> <span class="n">blurredCurrColor</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="o">//</span><span class="n">Gaussian</span> <span class="n">blur</span> <span class="n">currColor</span> <span class="n">with</span> <span class="m">3</span><span class="n">x3</span> <span class="n">neighborhood</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"><span class="nf">if </span><span class="p">(</span><span class="n">blendFactor</span> <span class="o">==</span> <span class="m">1</span><span class="n">.f</span><span class="p">)</span>
|
|
|
|
|
</span></span><span class="line"><span class="cl"> <span class="n">return</span> <span class="n">blurredCurrColor</span><span class="p">;</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><p>Gaussian blur使用的卷积核与$3\times3$相邻像素采样一致
|
|
|
|
|
<br>$ \begin{bmatrix} \frac{1}{16} & \frac{1}{8} &\frac{1}{16} \\ \frac{1}{8} &\frac{1}{4} &\frac{1}{8} \\ \frac{1}{16} &\frac{1}{8} &\frac{1}{16} \end{bmatrix} $</p>
|
|
|
|
|
<p>处理后依旧有1像素厚的鬼影存在
|
|
|
|
|
<img src="../../images/one_pixel_thick_ghosting.png" alt=""></p>
|
|
|
|
|
<p>产生原因:
|
|
|
|
|
<br>Color history 是线性采样,Stencil history 是点采样,两者在边缘并不相容</p>
|
|
|
|
|
<p>解决方法
|
|
|
|
|
<br>在stencil buffer里让物体向外扩大1像素</p>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>创建输入值为历史帧和stencil buffers的全屏shader</li>
|
|
|
|
|
<li>对每一个像素,将它的深度与周围4个相邻像素进行对比</li>
|
|
|
|
|
<li>输出深度接近的像素的模板(stencil of pixel)</li>
|
|
|
|
|
<li>将扩张的stencil buffer输入TAA</li>
|
|
|
|
|
<li>上一帧的stencil应该来自于扩张后</li>
|
|
|
|
|
<li>对扩张后的stencil做模板测试(stencil test)</li>
|
|
|
|
|
<li>边缘的检测则使用未扩张的版本</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>在计算完成后我们需要将目前帧的和历史帧的结果混合到一起</p>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-s" data-lang="s"><span class="line"><span class="cl"><span class="n">return</span> <span class="nf">lerp</span><span class="p">(</span><span class="n">historyColor</span><span class="p">,</span><span class="n">currColor</span><span class="p">,</span><span class="n">blendFactor</span><span class="p">)</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><p>出于平衡模糊和抖动的目的,blendFactor必须是一个动态的值
|
|
|
|
|
<br>由UE4在[siggraph 2014]提出的方法可知
|
|
|
|
|
<br>当局部对比度低的时候增加
|
|
|
|
|
<br>当历史帧在截断值附近或像素的偏移接近子像素时减少
|
|
|
|
|
<br>但在这样处理后依旧有模糊的情况残余</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<p>为了修复残余的模糊情况,我们可以再加入一个全屏的锐化处理
|
|
|
|
|
<br>对一个$3\times3$的相邻像素序列,采取$\begin{bmatrix} 0 &-1 &0 \\ -1 &4 &-1 \\ 0 &-1 &0 \end{bmatrix}$的权重比例,即</p>
|
|
|
|
|
<div class="highlight"><div class="chroma">
|
|
|
|
|
<div class="table-container"><table class="lntable"><tr><td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code><span class="lnt">1
|
|
|
|
|
</span></code></pre></td>
|
|
|
|
|
<td class="lntd">
|
|
|
|
|
<pre tabindex="0" class="chroma"><code class="language-s" data-lang="s"><span class="line"><span class="cl"><span class="n">return</span> <span class="nf">saturate</span><span class="p">(</span><span class="n">center</span> <span class="o">+</span> <span class="m">4</span> <span class="o">*</span> <span class="n">center</span><span class="o">-</span><span class="n">up</span><span class="o">-</span><span class="n">down</span><span class="o">-</span><span class="n">left</span><span class="o">-</span><span class="n">right</span><span class="p">)</span>
|
|
|
|
|
</span></span></code></pre></td></tr></table></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div><hr>
|
|
|
|
|
<h6 id="taa的性能"><a href="#taa的性能" class="anchor-link"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon anchor-icon"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></svg></a>TAA的性能</h6>
|
|
|
|
|
<p>主体shader在PS4的GPU上渲染1080p分辨率需要0.8ms</p>
|
|
|
|
|
<p>后续处理也存在开销
|
|
|
|
|
<br>Motion vector calculation 运动向量计算
|
|
|
|
|
<br>Sharpen shader (0.15ms) 锐化效果
|
|
|
|
|
<br>Expand stencil shader(0.4ms) 模板扩张</p>
|
|
|
|
|
<hr>
|
|
|
|
|
<p><a href="https://gamedev.stackexchange.com/questions/57607/what-is-the-difference-between-a-modelview-projection-matrix-and-world-view-proj" target="_blank" rel="noopener">WVP和MVP矩阵的区别</a></p>
|
|
|
|
|
<p><a href="https://computergraphics.stackexchange.com/questions/1976/how-to-determine-the-object-to-world-matrix#:~:text=The%20Object-To-World%20matrix%20is%20often%20called%20%22model-matrix%22.%20This,it%20and%20the%20math%20works%20out%20pretty%20well." target="_blank" rel="noopener">$ matrix_{objToWorld} $</a></p>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="updated-badge-container">
|
|
|
|
|
<span title="Updated @ 2023-06-18 21:19:01 CST" style="cursor:help">
|
|
|
|
|
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="130" height="20" class="updated-badge"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="130" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path class="updated-badge-left" d="M0 0h55v20H0z"/><path class="updated-badge-right" d="M55 0h75v20H55z"/><path fill="url(#b)" d="M0 0h130v20H0z"/></g><g fill="#fff" text-anchor="middle" font-size="110"><text x="285" y="150" fill="#010101" fill-opacity=".3" textLength="450" transform="scale(.1)">updated</text><text x="285" y="140" textLength="450" transform="scale(.1)">updated</text><text x="915" y="150" fill="#010101" fill-opacity=".3" textLength="650" transform="scale(.1)">2023-06-18</text><text x="915" y="140" textLength="650" transform="scale(.1)">2023-06-18</text></g></svg>
|
|
|
|
|
</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="post-nav">
|
|
|
|
|
|
|
|
|
|
<li class="post-nav-prev">
|
|
|
|
|
<a href="/computergraphic/z-buffer_%E6%B7%B1%E5%BA%A6%E7%BC%93%E5%AD%98/" rel="prev">< Z-Buffer 深度缓存</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="post-nav-next">
|
|
|
|
|
<a href="/computergraphic/%E8%B5%B0%E6%A0%B7%E4%B8%8E%E5%8F%8D%E8%B5%B0%E6%A0%B7/" rel="next">走样与反走样 ></a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div id="back-to-top" class="back-to-top">
|
|
|
|
|
<a href="#"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" class="icon arrow-up"><path d="M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z"/></svg></a>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<footer id="footer" class="footer">
|
|
|
|
|
<div class="footer-inner">
|
|
|
|
|
<div class="site-info">© 2022–2023 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon footer-icon"><path d="M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z"/></svg> InkSoul</div><div class="powered-by">Powered by <a href="https://github.com/gohugoio/hugo" target="_blank" rel="noopener">Hugo</a> | Theme is <a href="https://github.com/reuixiy/hugo-theme-meme" target="_blank" rel="noopener">MemE</a></div><div class="site-copyright"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank" rel="noopener">CC BY-NC-SA 4.0</a></div><div class="custom-footer"><a href="https://beian.miit.gov.cn" target="_blank" rel="noopener">闽ICP备2022009452号-1</a></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<ul class="socials"><li class="socials-item">
|
|
|
|
|
<a href="mailto:qingci30@163.com" target="_blank" rel="external noopener" title="Email"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="icon social-icon"><path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"/></svg></a>
|
|
|
|
|
</li><li class="socials-item">
|
|
|
|
|
<a href="https://github.com/ink-soul" target="_blank" rel="external noopener" title="GitHub"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="icon social-icon"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a>
|
|
|
|
|
</li><li class="socials-item">
|
2023-06-18 23:31:34 +08:00
|
|
|
|
<a href="http://gitea.inksoul.top/inksoul" target="_blank" rel="external noopener" title="gitea"><svg class="icon social-icon" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z" ></path></svg></a>
|
2023-06-18 23:16:41 +08:00
|
|
|
|
</li><li class="socials-item">
|
|
|
|
|
<a href="https://space.bilibili.com/262369930" target="_blank" rel="external noopener" title="bilibili"><svg class="icon social-icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.813 4.653h.854c1.51.054 2.769.578 3.773 1.574 1.004.995 1.524 2.249 1.56 3.76v7.36c-.036 1.51-.556 2.769-1.56 3.773s-2.262 1.524-3.773 1.56H5.333c-1.51-.036-2.769-.556-3.773-1.56S.036 18.858 0 17.347v-7.36c.036-1.511.556-2.765 1.56-3.76 1.004-.996 2.262-1.52 3.773-1.574h.774l-1.174-1.12a1.234 1.234 0 0 1-.373-.906c0-.356.124-.658.373-.907l.027-.027c.267-.249.573-.373.92-.373.347 0 .653.124.92.373L9.653 4.44c.071.071.134.142.187.213h4.267a.836.836 0 0 1 .16-.213l2.853-2.747c.267-.249.573-.373.92-.373.347 0 .662.151.929.4.267.249.391.551.391.907 0 .355-.124.657-.373.906zM5.333 7.24c-.746.018-1.373.276-1.88.773-.506.498-.769 1.13-.786 1.894v7.52c.017.764.28 1.395.786 1.893.507.498 1.134.756 1.88.773h13.334c.746-.017 1.373-.275 1.88-.773.506-.498.769-1.129.786-1.893v-7.52c-.017-.765-.28-1.396-.786-1.894-.507-.497-1.134-.755-1.88-.773zM8 11.107c.373 0 .684.124.933.373.25.249.383.569.4.96v1.173c-.017.391-.15.711-.4.96-.249.25-.56.374-.933.374s-.684-.125-.933-.374c-.25-.249-.383-.569-.4-.96V12.44c0-.373.129-.689.386-.947.258-.257.574-.386.947-.386zm8 0c.373 0 .684.124.933.373.25.249.383.569.4.96v1.173c-.017.391-.15.711-.4.96-.249.25-.56.374-.933.374s-.684-.125-.933-.374c-.25-.249-.383-.569-.4-.96V12.44c.017-.391.15-.711.4-.96.249-.249.56-.373.933-.373Z"/></svg></a>
|
|
|
|
|
</li></ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
</footer>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<script>
|
|
|
|
|
if ('serviceWorker' in navigator) {
|
|
|
|
|
window.addEventListener('load', function() {
|
|
|
|
|
navigator.serviceWorker.register('\/sw.js');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.css" integrity="sha256-gPJfuwTULrEAAcI3X4bALVU/2qBU+QY/TpoD3GO+Exw=" crossorigin="anonymous">
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
if (typeof renderMathInElement === 'undefined') {
|
|
|
|
|
var getScript = (options) => {
|
|
|
|
|
var script = document.createElement('script');
|
|
|
|
|
script.defer = true;
|
|
|
|
|
script.crossOrigin = 'anonymous';
|
|
|
|
|
Object.keys(options).forEach((key) => {
|
|
|
|
|
script[key] = options[key];
|
|
|
|
|
});
|
|
|
|
|
document.body.appendChild(script);
|
|
|
|
|
};
|
|
|
|
|
getScript({
|
|
|
|
|
src: 'https:\/\/fastly.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.js',
|
|
|
|
|
integrity: 'sha256-YTW9cMncW/ZQMhY69KaUxIa2cPTxV87Uh627Gf5ODUw=',
|
|
|
|
|
onload: () => {
|
|
|
|
|
getScript({
|
|
|
|
|
src: 'https:\/\/fastly.jsdelivr.net/npm/katex@0.13.0/dist/contrib/mhchem.min.js',
|
|
|
|
|
integrity: 'sha256-yzSfYeVsWJ1x+2g8CYHsB/Mn7PcSp8122k5BM4T3Vxw=',
|
|
|
|
|
onload: () => {
|
|
|
|
|
getScript({
|
|
|
|
|
src: 'https:\/\/fastly.jsdelivr.net/npm/katex@0.13.0/dist/contrib/auto-render.min.js',
|
|
|
|
|
integrity: 'sha256-fxJzNV6hpc8tgW8tF0zVobKa71eTCRGTgxFXt1ZpJNM=',
|
|
|
|
|
onload: () => {
|
|
|
|
|
renderKaTex();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
renderKaTex();
|
|
|
|
|
}
|
|
|
|
|
function renderKaTex() {
|
|
|
|
|
renderMathInElement(
|
|
|
|
|
document.body,
|
|
|
|
|
{
|
|
|
|
|
delimiters: [
|
|
|
|
|
{left: "$$", right: "$$", display: true},
|
|
|
|
|
{left: "\\[", right: "\\]", display: true},
|
|
|
|
|
{left: "$", right: "$", display: false},
|
|
|
|
|
{left: "\\(", right: "\\)", display: false}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script src="https://fastly.jsdelivr.net/npm/medium-zoom@latest/dist/medium-zoom.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
let imgNodes = document.querySelectorAll('div.post-body img');
|
|
|
|
|
imgNodes = Array.from(imgNodes).filter(node => node.parentNode.tagName !== "A");
|
|
|
|
|
|
|
|
|
|
mediumZoom(imgNodes, {
|
|
|
|
|
background: 'hsla(var(--color-bg-h), var(--color-bg-s), var(--color-bg-l), 0.95)'
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script src="https://fastly.jsdelivr.net/npm/instant.page@5.1.0/instantpage.min.js" type="module" defer></script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|