Lecture 05 Real-time Environment Mapping

news/2024/10/3 6:34:42

Lecture 05 Real-time Environment Mapping

Recap: Environment Lighting

  • 一张表示了来自四面八方的无穷远处光(distance lighting)的图片
  • Spherical map vs. cube map

Shading from environment lighing

非正式地命名为Image-Based Lighting (IBL)

\[L_o(p,\omega_o)=\int_{\Omega^+}L_i(p,\omega_i)f_r(p,w_i,w_o)\cos\theta_id\omega_i\\ 这里的渲染方程去掉了V(p,\omega_i) Visibility项,因为没有考虑阴影\\ \Omega^+表示上半球,和法线点乘是正的方向 \]

  • 通用解法:Monte Carlo intergration蒙特卡洛积分
    • 数值上无偏的近似
    • 需要大量的样本
  • 问题:非常慢
    • 通常,如果shader中出现了sampling,很可能就不能用在实时渲染中
      • 因为tempore的进展,时间、空间的滤波方式,sample复用的方式,使得越来越多的基于sampling的方法可以在实时渲染中应用了
      • 但是还是尽量避免sampling
    • 尽可能避免sampling

\[L_o(p,\omega_o)=\int_{\Omega^+}L_i(p,\omega_i)f_r(p,w_i,w_o)\cos\theta_id\omega_i\\ \]

渲染方程Lighting项和BRDF项相乘再积分

  • 如果BRDF项是glossy的(左图),说明覆盖球面的情况下覆盖的挺小(support小)
  • 如果BRDF项是diffuse的(右图),覆盖半球区域大,但是非常smooth

于是可以用经典的近似方案:

条件:

  • g(x)的support比较小
  • g(x)比较smooth

满足其一即可

\[\int_{\Omega}f(x)g(x)dx \approx \frac{\int_{\Omega_G}f(x)dx}{\int_{\Omega_G}dx}\cdot \int_{\Omega}g(x)dx\\ 这里f(x)只需积g函数有值的地方就好 \]

\[L_o(p,\omega_o) \approx \frac{\int_{\Omega_{f_r}}L_i(p,\omega_i)d\omega_i}{\int_{\Omega_{f_r}}d\omega_i} \cdot \int_{\Omega^+}f_r(p,\omega_i,\omega_o)\cos\theta_i d\omega_i \]

将Lighting项拆出来,表示为光照在BRDF项范围的积分,再除以一个在BRDF项范围内的空积分来做归一化

*区别于前面Shadow Map,Shadow Map中是将Visibility项拆出来,这里是将Light拆出来

也可以理解成拆出来的项是在滤波,而support的大小决定了filter核的大小

The split sum approximation

1st Stage Prefiltering

这里是在球面上做预计算

  • 用不同大小的滤波核近似
  • 查询时通过上一步生成的图中三线性插值得到中间filter size的图(类似Mipmap)

为什么要做filtering?

要计算一个shading point对应的环境光项,会在其周围分布一些采样,再做加权平均,从而得到shading point的值

这个操作就约等于先对环境光做好一个filtering,这样采样到的环境光的任何一个点都是原先一系列点的加权平均,于是就只需在镜面反射的方向上查询一次

这里对应的是前面渲染方程中拆出来的Lighting项

2nd Stage

思想:

  • 预计算所有可能的参数(roughness, color (Fresnel term) )的不同组合得出的值
  • 这样做参数太多,需要一个五维的表来记录结果(roughness一维,rgb三维,角度一维)
  • 预计算是非常正常的做法,但可能无法承受高纬度的预计算
  • 如何降低维度?
Recall: Microfacet BRDF 微表面BRDF

\[f(i,o)=\frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)}\\ F(i,h)为Fresnel\ term菲涅尔项,决定垂直地看向物体表面,有多少能量被反射,直接决定了颜色\\ G(i,o,h)为shadowing-masking term,描述光线入射或反射时被其他微表面遮挡的情况,\\G为几何衰减因子,输出未被遮蔽而能从l反射到v方向的比例\\ D(h)为微表面法线分布项,如果法线分布在四面八方则为diffuse,如果都集中在某一方向则接近镜面\\ \]

Schlick's approximation

\[R(\theta)=R_0+(1-R_0)(1-\cos\theta)^5\\ R_0=(\frac{n_1-n_2}{n_1+n_2})^2\\ R_0初始反射率,\theta入射角度\\ 一般认为入射光与法线夹角、出射光与法线夹角,以及半角(入射光和出射光夹角的一半)是可以互换的 \]

能够近似地描述菲涅尔项,将其近似成一个指数函数,定义了一个初始反射率\(R_0\),以及函数如何增长\((1-\cos\theta)^5\)

Beckmann distribution

\[D(h)=\frac{e^{-\frac{\tan^2\theta_h}{\alpha^2}}}{\pi\alpha^2\cos^4\theta_h}\\ \alpha\ roughness,定义这个分布是胖还是瘦,决定材质是diffuse还是glossy\\ \theta_h\ half\ vector半程向量和法线的夹角,可以通过某种方式描述成跟入射角相关的\\ \]

NDF项使用Beckmann distribution,结果只与粗糙度\(\alpha\)和半程向量与法线夹角\(\theta_h\)有关

降维后的预计算

于是就将刚刚五维的预计算变成了三维的预计算,参数为\(初始反射率R_0,入射角\theta,roughness\ \alpha\)

继续降维:

\[\int_{\Omega^+}f_r(p,\omega_i,\omega_0)\cos\theta_id\omega_i \approx R_0\int_{\Omega^+}\frac{f_r}{F}(1-(1-\cos\theta_i)^5)\cos\theta_id\omega_i+\\ \int_{\Omega^+}\frac{f_r}{F}(1-\cos\theta_i)^5\cos\theta_id\omega_i \]

\(R_0\)拆到了积分外边,将原本积分对于基础反射率\(R_0\)的依赖给消除了,BRDF中的\(f_r\)和菲涅尔项\(F\)上下消掉了,剩下的只有两个参数\(\theta_i和\alpha\),降到了二维,这样两个积分部分刚好放在一张纹理的两个通道,于是计算环境光照只需求查询纹理,不需要采样了

  • 计算避免了sampling
  • 非常快且结果正确
在工业界叫做split sum
  • split integral 积分\(\rightarrow\)split sum 求和
  • \(\frac{1}{N}\underset{k=1}{\overset{N}\sum}\frac{L_i(l_k)f(l_k,v)\cos\theta_{l_k}}{p(l_k,v)}\approx(\frac{1}{N}\underset{k=1}{\overset{N}{\sum}}L_i(l_k))(\frac{1}{N}\underset{k=1}{\overset{N}{\sum}}\frac{f(l_k,v)\cos\theta_{l_k}}{p(l_k,v)})\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/55315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Lecture 02 Recap of CG Basics

Lecture 02 Recap of CG Basics Graphics Pipeline光栅化、深度测试、Blinn-Phong模型、纹理映射&插值 OpenGL 总结:每一个pass定义物体、相机、MVP 定义帧缓冲区、输入输出纹理 定义Vertex Shader / Fragment Shader 渲染其他的多趟pass 如ShadowMapShading Languages Sh…

VulNyx - System

扫描发现 2121是ftp端口 8000 http的一个端口 6379redis端口爆破redis的密码爆破出来时bonjour猜测ftp的密码和redis的密码是一样的 尝试用密码去爆出ftp的用户名报出来用户名是ben那么根据现有的条件 我们可以利用ftp上传文件 可以用redis module load 加载文件那么我们可以用…

Lecture 03 Real-time Shadows 1

Real-time Shadows 1 Recap: shadow mapping Shadow Mapping2-Pass AlgorithmThe light pass generates the shadow map the camera pass uses the shadow mapAn image-space algorithm好处:无需场景中的几何信息 坏处:导致自遮挡和走样问题PassPass 1: Render from light从光…

[转]高斯-牛顿算法

Gauss-Newton算法是解决非线性最优问题的常见算法之一,最近研读开源项目代码,又碰到了,索性深入看下。本次讲解内容如下:基本数学名词识记 牛顿法推导、算法步骤、计算实例 高斯牛顿法推导(如何从牛顿法派生)、算法步骤、编程实例 高斯牛顿法优劣总结 一、基本概念定义 1.非…

USB TCPM

USB TCPM(Type-C Port Manager)的主要作用是管理 USB Type-C 端口的连接和电源传输协议(USB Power Delivery, PD),确保设备正确识别、协商和切换数据传输和电源供应的角色。TCPM 在 USB Type-C 连接中起到关键管理作用,主要职责包括:管理 USB Type-C 插拔检测:检测设备…

ZBook14灵耀

[cpu]13900H:3000 [LPDDR5 4800]4*8G:550 [IPS 140GF-2L01-14 ] :300 [WD]SN560 1T:400 [板3402]:900

[转]OpenCV4.8 GPU版本CMake编译详细步骤 与CUDA代码演示

导 读 本文将详细介绍如何使用CMake编译OpenCV4.8 CUDA版本并给出Demo演示,方便大家学习使用。 CMake编译详细步骤废话不多说,直接进入正题!【1】我使用的工具版本VS2017 + CMake3.18.2 + OpenCV4.8.0 + CUDA11.2一般情况下VS版本≥VS2017均可,CMake版本≥3.18.2,OpenC…

[图文直播]搭建Zfile私有网盘

特别提醒 部署好后,发现还需要借助外部存储源,而且暂时还没有增加对FTP的支持,那就意味着即便我搭建私有FTP,也暂时无法实现真正的私有网盘。暂时不符合我的要求,仅记录。 前言 以下是ZFile的官网,上面也涉及到了搭建方法 https://docs.zfile.vip/install/os-windows 此次…