2022-04-16-GAMES202高质量实时渲染-Lecture5-6-Environment Light

Lecture 5-6 Environment Lighting Recap 环境光贴图 球面贴图 Spherical Map / 立方体贴图 Cube Map Shading from Environment Lighting / Image-Based Lighting (IBL) 解渲染方程(不考虑阴影) \[ L_o(\mathrm p,\omega_o)=\int_{\Omega^+}L_i(\mathrm p,\omega_i)f_r(\mathrm p,\omega_i,\omega_o)\cos\theta_i\xcancel{V(\mathrm p,\omega_i)}\,\mathrm d\omega_i \] 蒙特卡洛积分——数值解、大量采样,非常慢 PS: 一旦涉及采样,就很难实时,近年开始有一些进展 观察: glossy BRDF : BRDF覆盖很小 diffuse BRDF : BRDF覆盖大,但是平滑 因此考虑近似方法 \[ \int_\Omega f(x)g(x)\,\mathrm dx\approx\dfrac{\int_{\Omega_G}f(x)\,\mathrm dx}{\int_{\Omega_G}\,\mathrm d x}\cdot\int_\Omega g(x)\,\mathrm dx \] (该式在 \(g(x)\) 范围小/结果平滑时较为准确) 则有 \[ L_o(\mathrm p,\omega_o)\approx\dfrac{\int_{\Omega_{f_r}}L_i(\mathrm p,\omega_i)\,\mathrm d\omega_i}{\int_{\Omega_{f_r}}\,\mathrm d\omega_i}\int_{\Omega^+}f_r(\mathrm p,\omega_i,\omega_o)\cos\theta_i\,\mathrm d\omega_i \] \(\dfrac{\int_{\Omega_{f_r}}L_i(\mathrm p,\omega_i)\,\mathrm d\omega_i}{\int_{\Omega_{f_r}}\,\mathrm d\omega_i}\) 表示对环境光贴图做模糊化处理,即滤波...

2022-04-14-GAMES202高质量实时渲染-Lecture14-Practical Industrial Solutions

Lecture 14 Practical Industrial Solutions Temporal Anti-Aliasing, TAA Recall: why aliasing 光栅化的采样数不够 终极解决方案:加样本(MSAA) TAA:应用Temporal信息,与RTRT的降噪思路一致 每四帧复用: (如果不是4个固定位置而是是随机生成,引入了其他高频信息,效果并不好) Notes on AA MSAA vs SSAA SSAA:按几倍分辨率渲染场景,再下变换,效果好开销大 MSAA:对SSAA的效率改进 对一个像素内的一个Primitive,只采样一次(取中心或其他代表点) 空间上的Sample Reuse:样本分布上的Trick 基于图像的反走样方法 SMAA, Enhanced Subpixel Morphological AA FXAA -> MLAA(Morphological AA) -> SMAA G-Buffer一定不能反走样!(信息会出错) Temporal Super Resolution Super resolution == Super sampling 提升分辨率 eg. DLSS DLSS 1.0 全靠猜,每个游戏/场景单独训练一个网络 DLSS 2.0 利用Temporal信息 应用类似TAA的思路 重用Samples 问题:Temporal failure时不能clamp——因为每一个像素需要一个明确的值 DL不输出图像,而是输出关于上一帧的Temporal信息如何利用 Deferred Shading 延迟渲染 提高Shading效率 传统管线 Triangles -> Fragments -> Depth Test -> Shading -> Pixel 每一个Fragment都需要做Shading 复杂度:\(O(\text{\#Fragment}*\text{\#Light})\) 关键想法:有很多Fragment不会被看到 -> 只对被看到的Fragment做Shading 修改管线 光栅化两次场景 Pass 1 : 不做Shading,更新Depth Buffer Pass 2 : 对可见的Fragment做Shading 复杂度:\(O(\text{\#Vis....

2022-04-12-GAMES202高质量实时渲染-Lecture12-13-Real Time Ray Tracing

Lecture 12-13 Real-Time Ray-Tracing RTX : 10G rays per second == 1 sample per pixel 1 SPP path tracing == 1 rasterization (primary) + 1 ray (primary visibility) + 1 ray (primary bounce) + 1 ray (primary vis.) + 1 SPP is Extremely Noisy Key Tech : Denosing Goals : + Quality (no overblur, no artifacts, keep all details) + Speed (< 2ms to denoise per frame) ==> Temporal !...

2022-04-10-UE5.0时给系里写的Lumen和Nanite的一些介绍性文字

开头说明一下,这是UE5.0正式版发布时给系里和某些合作单位供稿的一些介绍性文字,比较简单的整理,非最终发布版(考虑到影视业读者还在这基础上进一步删减了),补充发布到自己个站算是留痕吧 虚幻引擎5.0新功能为电影虚拟化制作助力 2021年5月26日,Epic Games推出虚幻引擎5.0 Early Access抢先体验版本,吸引了各行业的大量关注,其推出的Lumen、Nanite等新功能带来了更佳的实时渲染质量和更高的创作效率。直至2022年4月5日,Epic Games正式发布虚幻引擎5.0版本,长达近一年的预览期内,包括影视创作行业在内的各领域创作者、研究者进行了大量的探索和尝试。随着正式版本发布、新功能不断完善、更多的官方解析释出和源代码的发布,我们也对虚幻引擎5.0的许多新功能有了更加深入清晰的认识。 电影虚拟化制作作为基于实时渲染引擎的新型电影制作方案,随着虚幻引擎的完善与发展,及其对电影虚拟化制作相关功能的补充,近年来许多具体的解决方案通过虚幻引擎来实现。因此,虚幻引擎更新至5.0也引发了影视制作行业的重点关注。本文即关于虚幻引擎5.0中为电影虚拟化制作带来新动力的新功能,做一定的简单分析。 新功能概览 虚幻引擎中的电影虚拟化制作模块In-Camera VFX自虚幻引擎4.25开始发展,直至4.27有一个比较全面的更新,达到了基本完善的程度。而虚幻引擎5.0的早期开发是与4.27版本同步进行的,因此在5.0的早期预览版本中仍然使用的是4.26的In-Camera VFX系统。更新5.0正式版后,In-Camera VFX系统也承接了4.27版本中的形态,以更成熟的结构呈现。 在虚幻引擎5.0中,电影虚拟化制作相关功能获得了nDisplay虚拟纹理、nDisplay内视锥过扫描、相机镜头校准、DMX等插件、关卡快照、Switchboard、Sequencer、USD流程等诸多功能的支持和改进。 但由于In-Camera VFX系统在5.0中的开发刚刚开始,有不少5.0版本的新功能尚未能在In-Camera VFX和其依赖的nDisplay系统中获得支持,比如Lumen的渲染管线。不过进一步的支持应该也只是一个时间问题。相信在这些新功能的加持下,In-Camera VFX系统的电影虚拟化制作能力将达到一个新高度。 可以预见Lumen、Nanite为主导的渲染新功能将为电影虚拟化制作带来更高的背景影像质量和更高的场景资产制作效率, Lumen Lumen是虚幻引擎5.0给出的“新一代”动态全局光照解决方案,其代码存放在Engine/Source/Runtime/Renderer/Private/Lumen中。 Lumen的整体思路是以SDF(Signed Distance Field) Trace为主的混合Tracing框架,同时用重新设计的Surface Cache场景表达,Radiance Cache作为最终的渲染结果收集。 混合的Tracing方案 在Lumen中,也可以先尝试调用基于硬件的RTX Trace,但主要还是软件的混合Tracing方案。其中包括Screen Space Trace、Mesh SDF Trace、Voxel Trace(Global SDF Trace),按这一顺序依次Trace,前者失败则交给后者计算,成功则返回。 Screen Space Trace 首先是屏幕空间的Trace方法,它来自于虚幻引擎4.25就加入的SSGI(Screen Space Global Illumination)方案。这一方法能够很好地处理近似场景表达中丢失的细节。它利用HZB(Hierarchical Z-Buffer)优化遍历,可以改善线性遍历时的漏光问题,针对HZB带来的高开销问题,则限制其Trace步长在50步以内,否则交给下一种Trace方法。 世界空间的SDF Trace 屏幕空间方法失败之后,来到世界空间的Trace方法,也是Lumen的Trace管线中最为主要的Trace方法:SDF Trace。 对于近处的场景(例如1.8m内),Lumen采用Mesh SDF存储。对每一个Mesh存储一份SDF,实现相对低效但具有较好效果的SDF Trace。 在Mesh SDF中,为了解决物体厚度小于SDF存储的体素大小时判断失败的问题,Lumen对每一个物体扩展0.5倍的体素大小,这样保证了每一种厚度的物体都能够被Trace到,Trace到物体计算Radiance时再做相应的偏移梯度计算就能够得到相对准确的结果。 而远景则将每一个物体的Mesh SDF合并为全局的Global SDF,并生成层级结构Clipmaps。这样降低了远景场景的Trace精度,但大大提高了效率。 Global SDF的显存占用较大,更新开销正比于场景中的运动物体数量。这里采用了稀疏的存储方式,跳过大量的负值、零值SDF区域,减少了16倍的存储量,同时带来的多一次查询的问题则生成一层MIP2的贴图来改善:先查询MIP2,在接近物体表面时再查询全精度的Clipmap,这样对场景的更新也带来了遍历。 最后,对于每一步的Trace结构,还需要做一次压缩,以减小占用、提升缓存一致性。 这样,SDF Trace将Tracing、远景场景、远景场景复杂解耦,带来了较高的效率。但同时也具有体积存储大、缺乏微小细节、无法参数化表面数据等问题。 Surface Cache 在Surface Cache中,预先进行了一次分离的材质计算和光照计算的pass,在Tracing计算时,直接在Hit位置对Surface Cache作一次查询即可获得相对好的结果,提高Tracing效率。 Mesh Card SDF Trace无法用传统的三角形表达插值着色,因此Lumen使用Mesh Card的方式参数化存储场景表达。Mesh Card是渲染之前离线提前生成的有向矩形块,覆盖在模型表面——因此当模型较为模块化时效果较好。...

April 10, 2021

2023年校招简历

2023年灾难性的春秋招时的两份简历,现在早已脱敏了,留个档案记录吧。 影视工作和游戏工作基本都用的这两份,可能个别公司有特殊要求有修订版就不列在此了。 春招用,还没有实习的: 秋招用,已经有实习了: 唯一的作品集:https://www.bilibili.com/video/BV1sb4y1S7Za/ (没有专门的作品集,也没什么游戏作品,拿了个大二时的调色作业来充数…)

April 10, 2021

2021-04-05-GAMES202高质量实时渲染-Lecture3-4-Soft Shadow

Lecture 3-4 Soft Shadow Recap of Shadow Mapping - 点光源 从“Light”处看向场景,生成场景关于光源的深度图,即Shadow Map; 从相机处看向场景渲染画面,利用Shadow Map判断像素是否在阴影中。 Feature: 基于二维图像的算法,而不需要三维几何场景 使用透视投影后Z值或透视投影前实际距离生成深度图皆可,Shadow Map与阴影生成时的深度判定方式一致即可 Problem Self occlusion 自遮挡 Shadow Map的每一个像素记录同一深度,形成下图现象。在单个/行像素采样处,形成尺寸为像素宽高的遮挡面。 解决方案:在反射表面邻近区域不计算遮挡。不计算区域Light长度(Bias)由Light与反射表面法线夹角决定。(Light垂直于表面时不产生自遮挡问题)。——带来新问题:丢失遮挡关系。 Detached shadow 由解决自遮挡的Bias不计算带来的阴影残缺问题。 工业界无法彻底解决该问题,通过找到合适的Bias值减少视觉问题。 学术解决方案:Second-depth shadow mapping 存储第一深度和次级深度(离得第二近的表面距离),取中间值作为深度判断的值。 存在问题:要求所有物体watertight(有正反面);计算量过大。 实时渲染不相信复杂度,只相信绝对速度!因此工业界不适用。 Aliasing 采样 The math behind shadow mapping 微积分中常见的不等式: \[ \begin{array}{c} Schwarz不等式: \displaystyle\left[\int_a^bf(x)g(x)\,\mathrm d x\right]^2\le\int_a^bf^2(x)\,\mathrm d x\cdot\int_a^bg^2(x)\,\mathrm d x\\ Minkowski不等式:\displaystyle\left\{\int_a^b\left[f(x)+g(x)\right]^2\,\mathrm d x\right\}^\frac{1}{2}\le\left\{\int_a^bf^2(x)\,\mathrm d x\right\}^\frac{1}{2}+\left\{\int_a^bg^2(x)\,\mathrm d x\right\}^\frac{1}{2} \end{array} \] Approximation in RTR: But we care more about “approximately equal”....

2022-04-02-GAMES202高质量实时渲染-Lecture10-11-Physically-Based Material

Lecture 10-11 Physically-Based Material Content Real-Time Physically-Based Materials Microfacet BRDF Disney principled BRDF Shading with microfacet BRDFs under polygonal lighting Linearly Transformed Cosines (LTC) Concept Physically-Based Rendering (PBR) Everything in rendering should be physically based Materials, lighting, camera, light transport, etc. Not just materials, but usually referred to as materials PBR materials in RTR The RTR community is much behind the offline community “PB” in RTR is usually not actually physically based PBR materials in RTR...

2021-03-11-数值分析-Day14-RungeKutta方法-线性多步方法

7.5 - 7.7 Runge-Kutta方法 单步高阶方法构造思路 设 \(y(x)\) 是一阶常微分方程初值问题的精确解,Taylor展开得: \[ \begin{aligned} \displaystyle y(x_{n+1})&=y(x_n)+y'(x_n)h+\frac{y''(x_n)}{2!}h^2+\dots+\frac{y^{(p)}(x_n)}{p!}h^p+\frac{y^{({p+1})}(x_n)}{(p+1)!}h^{p+1}\\ &=y(x_n)+hf(x_n,y(x_n))+\frac{h^2}{2!}f^{(1)}(x_n,y(x_n))+\dots+\frac{h^p}{p!}f^{(p-1)}(x_n,y(x_n))+O(h^{p+1})\end{aligned} \] 因此可建立节点处近似值 \(y_n\) 满足的差分公式: \[ \left\{\begin{array}{l}\displaystyle y_{n+1}=y_n+hf(x_n,y_n)+\frac{h^2}{2!}f^{(1)}(x_n,y_n)+\dots+\frac{h^p}{p!}f^{(p-1)}(x_n,y_n)\\y_0=\alpha,\quad n=0,1,\dots,N-1\end{array}\right. \] 称之为 \(\mathbf p\) 阶Taylor展开方法。 其中: \(\begin{array}{l}\displaystyle f^{(1)}(x,y)=\frac{\partial f(x,y)}{\partial x}+\frac{\partial f(x,y)}{\partial y}f(x,y)\\\displaystyle f^{(2)}(x,y)=\frac{\partial^2f}{\partial x^2}+2\frac{\partial^2f}{\partial x\partial y}f+\frac{\partial^2 f}{\partial y^2}f^2+\frac{\partial f}{\partial x}\frac{\partial f}{\partial y}+\left(\frac{\partial f}{\partial y}\right)^2f\\\dots\end{array}\) 计算过于复杂,很少直接使用 减少Taylor展开次数得: \[ y(x_{n+1})=y(x_n)+hy'(\xi)=y(x_n)+hf(\xi,y(\xi)),\quad x_n\le\xi\le x_{n+1} \] 构造差分方法即利用适当的函数值来近似计算 \(f(\xi,y(\xi))\) 。 Euler方法用 \(K_1\) 作为其近似,其 \(y_{n+1}\) 表达式与精确解的Taylor展式前 \(2\) 项一致。为 \(1\) 阶方法。 改进Euler方法用 \(K_1,K_2\) 的线性组合作为其近似,其 \(y_{n+1}\) 表达式与精确解的Taylor展式前 \(3\) 项一致。为 \(2\) 阶方法。 能否增加计算 \(f(x,y)\) 的次数来提高方法阶数? Runge-Kutta方法 \[ \left\{\begin{array}{l} y_{n+1}=y_n+h(\lambda_1K_1+\lambda_2K_2+\dots+\lambda_pK_p)\\ K_1=f(x_n,y_n)\\ K_2=f(x_n+\alpha_2h,y_n+h\beta_{21}K_1)\\ \dots\\ K_p=f(x_n+\alpha_ph,y_n+h\sum\limits_{i=1}^{p-1}\beta_{pi}K_i) \end{array}\right....

2022-03-11-GAMES202高质量实时渲染-Lecture8-9-GI in Screen Space

Lecture 8-9 Real-time Global Illumination (Screen Space) Screen Space : 利用相机视角渲染出来的屏幕中的所有信息 可以认为是对渲染结果的Post Processing Screen Space Ambient Occlusion (SSAO) AO 环境光遮蔽 : 通过Contact Shadow使物体间相对位置明显SSAO : 对全局光照的近似的屏幕空间方法 Key idea : 不知道间接光照 假定间接光照值是常数(对所有着色点、从所有方向) like Blinn-Phong 考虑不同着色点对各方向的Visibility(不同于Blinn-Phong的地方) 离线渲染中的AO——“天光”:等同于一个完全均匀的光照 Theory : Rendering Equation \[ L_o(\mathrm p,\omega_0)=\int_{\Omega_\mathrm{patch}}L_i(\mathrm p,\omega_i)f_r(\mathrm p,\omega_i,\omega_0)V(\mathrm p,\omega_i)\cos\theta_i\,\mathrm d\omega_i \] 考虑对Rendering Equation的近似(“The RTR Approximation / Equation”) \[ \int_\Omega f(x)g(x)\,\mathrm d x\approx\dfrac{\int_{\Omega_G} f(x)\,\mathrm d x}{\int_{\Omega_G} \,\mathrm d x}\cdot\int_\Omega g(x)\,\mathrm d x \] 将Visibility项拆出,得: \[ \begin{aligned} L_o^{\rm indir}(\mathrm p,\omega_0)\approx&\dfrac{\int_{\Omega_+} V(\mathrm p,\omega_i)\cos\theta_i\,\mathrm d\omega_i}{\int_{\Omega_+}\cos\theta_i\,\mathrm d\omega_i}\cdot\\ \approx&\int_{\Omega_+}L_i^{\rm indir}(\mathrm p,\omega_i)f_r(\mathrm p,\omega_i,\omega_0)\cos\theta_i\,\mathrm d\omega_i\\ =&k_A\cdot \underbrace{L_i^{\rm indir}(p)\rho}_{\rm constant\ for\ AO} \end{aligned} \]...

2021-03-10-数值分析-Day13-差分公式

7.1 - 7.4 差分公式 一阶常微分方程初值问题 一阶常微分方程初值问题的一般形式为: \[ \left\{\begin{array}{l}\displaystyle\frac{dy}{dx}=f(x,y),\quad a\le x\le b\\y(a)=\alpha\end{array}\right. \] 其中 \(f(x,y)\) 为已知函数, \(\alpha\) 为给定的值。 在许多数学模型中,上述方程通常以 \(x\) 描述时间,而定解条件 \(y(a)=\alpha\) 则给出了函数 \(y(x)\) 在初始时刻的取值。因此称为初值问题。 问题: + 上述方程何时存在唯一解 + 如何计算 \(y(x)\) Lipschitz条件: 若函数 \(f(x,y)\) 在区域 \(\{a\le x\le b,\ m<y<M\}\) 上连续,满足 \[ \forall y,\bar{y},\ |f(x,y)-f(x,\bar{y})|\le L|y-\bar{y}| \] 其中 \(L>0\) 为Lipschitz常数(此处Lipschitz常数可以 \(\ge1\) ),则初值问题在初始时刻 \(a\) 的某个邻域上存在唯一解。 (不满足Lipschitz条件时,不一定存在唯一解。) 构造一阶常微分方程初值问题数值解法 假设初值问题的解 \(y=y(x)\) 唯一存在且足够光滑。对求解区域 \([a,b]\) 做等距剖分 \(a=x_0<x_1<x_2<\dots<x_n<\dots<x_N=b\) 。称 \(h=(b-a)/N\) 为剖分步长, \(x_n=a+nh,\ n=0,1,\dots,N\) 为剖分节点。数值解法即求精确解 \(y(x)\) 在剖分节点 \(x_n\) 上的值 \(y(x_n)\) 的近似值 \(y_n\) 。...