Polygonal-Light Shading with LTC

概述

如果我们有一个上半球的余弦分布函数(Do)(D_{o})(Do),并对这个余弦分布函数进行一个矩阵(M)(M)(M)变换,变换为一个新的分布函数(D)(D)(D)

  1. D=MDoD = M D_{o}D=MDo


这就是基本思想:用一个余弦分布函数来拟合出不同的分布函数,并且误差很小。

LTC基本定义与性质

我们定义DoD_{o}Do我们的基函数,也就是我们的原始分布函数。
我们在DoD_{o}Do上采样一个方向向量ωo\omega_{o}ωo,那么我们对这个方向向量做一个线性变换,也就是做一个MMM矩阵乘法变换为一个新的方向向量ω\omegaω

  1. ω=Mωo∣∣Mωo∣∣\omega = \frac{M\omega_{o}}{||M\omega_{o}||}ω=MωoMωo,
  2. ωo=M−1ω∣∣M−1ω∣∣\omega_{o} = \frac{M^{-1}\omega}{||M^{-1}\omega||}ωo=M1ωM1ω,

那么一个目标分布函数D(ω)D(\omega)D(ω)如何变换为Do(ωo)D_{o}(\omega_{o})Do(ωo)呢?

即就是一个变量替换:

  1. D(ω)=Do(ωo)∂ωo∂ω=Do(M−1ω∣∣M−1ω∣∣)∣M−1∣∣∣M−1ω∣∣3D(\omega) = D_{o}(\omega_{o})\frac{\partial\omega_{o}}{\partial\omega} = D_{o}(\frac{M^{-1}\omega}{||M^{-1}\omega||})\frac{|M^{-1}|}{||M^{-1}\omega||^{3}}D(ω)=Do(ωo)ωωo=Do(M1ωM1ω)M1ω3M1

∂ωo∂ω=∣M−1∣∣∣M−1ω∣∣3\frac{\partial\omega_{o}}{\partial\omega} = \frac{|M^{-1}|}{||M^{-1}\omega||^{3}}ωωo=M1ω3M1是Jacobian项,可以从几何关系上进行推导。

那就让我们简单推导一下吧!(假如想要了解详细,请参考原文哦!)
在这里插入图片描述
这要从立体角开始推导啦。我们定义一个原始分布上的立体角∂ωo\partial\omega_{o}ωo,将其进行MMM变换,得到一个新的立体角∂ω\partial\omegaω

  1. ∂ω=∂ωoAcosθr2\partial\omega = \partial\omega_{o}A\frac{cos\theta}{r^{2}}ω=ωoAr2cosθ

这就是一个立体角的定义。让我们来探讨一下里面的面积与距离的表达吧!
在这里插入图片描述
偷懒一下,可以从图中看到面积与距离的表达,那么让我们来化简一下吧。

  1. Mω1×Mω2=∣M∣M−T(ω1×ω2)=∣M∣M−TωoM\omega_{1}\times M\omega_{2} = |M|M^{-T}(\omega_{1} \times \omega_{2}) = |M|M^{-T}\omega_{o}Mω1×Mω2=MMT(ω1×ω2)=MMTωo
  2. ∂ω∂ωo=∣M∣∣∣Mωo∣∣3\frac{\partial\omega}{\partial\omega_{o}} = \frac{|M|}{||M\omega_{o}||^{3}}ωoω=Mωo3M
  3. ∂ωo∂ω=M−1∣∣M−1ω∣∣3\frac{\partial\omega_{o}}{\partial\omega} = \frac{M^{-1}}{||M^{-1}\omega||^{3}}ωωo=M1ω3M1

如果MMM是缩放矩阵或者旋转矩阵,这个Jacobian项等于一。即分布形状是不变的。

让我们假设矩阵是缩放矩阵(M=λIM = \lambda IM=λI),

  1. ∣M−1=∣M∣=∣λI∣=λ3|M^{-1} = |M| = |\lambda I| = \lambda^{3}M1=M=λI=λ3
  2. ∣∣M−1ω∣∣=∣∣λIω∣∣=λ||M^{-1}\omega|| = ||\lambda I \omega|| = \lambdaM1ω=λIω=λ
  3. ∂ωo∂ω=∣M−1∣∣∣M−1ω∣∣3=1\frac{\partial\omega_{o}}{\partial\omega} = \frac{|M^{-1}|}{||M^{-1}\omega||^{3}} = 1ωωo=M1ω3M1=1

让我们假设矩阵是旋转矩阵M=RM = RM=R

  1. ∣M∣=∣M−1∣=1|M| = |M^{-1}| = 1M=M1=1
  2. ∣∣M−1ω∣∣=1||M^{-1}\omega|| = 1M1ω=1
  3. ∂ωo∂ω=1\frac{\partial\omega_{o}}{\partial\omega} = 1ωωo=1

那么被变换后的分布DDD有哪些性质呢?

首先是范数:

  1. ∫ΩD(ω)dω=∫ΩDo∂ωoωdω=∫ΩDo(ωo)dωo\int_{\Omega}D(\omega)\mathrm{d}\omega = \int_{\Omega}D_{o}\frac{\partial\omega_{o}}{\omega}\mathrm{d}\omega = \int_{\Omega}D_{o}(\omega_{o})\mathrm{d}\omega_{o}ΩD(ω)dω=ΩDoωωodω=ΩDo(ωo)dωo

其次对于多边形积分相等:

  1. ∫PD(ω)dω=∫PoDo(ωo)dωo\int_{P}D{(\omega)}\mathrm{d}\omega = \int_{P_{o}}D_{o}(\omega_{o})\mathrm{d}\omega_{o}PD(ω)dω=PoDo(ωo)dωo
    Po=M−1PP_{o} = M^{-1}PPo=M1P

使用LTC近似BRDF

我们在对LTC有了一些基本的认识之后,让我们用它来进行拟合BRDF吧! 这里作者使用了各项同性的GGX微表面分布模型。

对于一个原分布DoD_{o}Do,我们选择一个上半球的余弦分布,当然还可以选择cosine2cosine^{2}cosine2,均匀半球分布等:

  1. Do(ωo=(x,y,z))=1πmax(0,z)D_{o}(\omega_{o} = (x,y,z)) = \frac{1}{\pi}max(0,z)Do(ωo=(x,y,z))=π1max(0,z)

我们来定义一下目标分布吧,也就是我们将要拟合的BRDF分布函数带着余弦项的:

  1. D≈ρ(ωv,ωl)cosθlD \approx \rho(\omega_{v},\omega_{l})cos\theta_{l}Dρ(ωv,ωl)cosθl

对于一个各项同性的材质而言,BRDF函数分布只依赖于入射方向ωv=(sinθv,0,cosθv)\omega_{v} = (sin\theta_{v},0,cos\theta_{v})ωv=(sinθv,0,cosθv)和粗糙度α\alphaα

我们发现可以用一个矩阵MMM来很好的拟合DDD,矩阵被写为:

  1. M=[a0b0c0d01]M = \begin{bmatrix} a& 0 &b \\ 0& c & 0\\ d& 0 &1 \end{bmatrix}M=a0d0c0b01

可以看见这个矩阵只有四个参数需要被确定。


可以从图中看出拟合效果很不错!

使用LTC进行多边形光源的着色

我们在不同的多边形光源PPP上计算直接光照的着色,ωv\omega_{v}ωv代表视口方向(view direction),ρ\rhoρ代表BRDF函数,LLL是多边形光源出射的radiance。

  1. I=∫PL(ωl)ρ(ωv,ωl)cosθldωlI = \int_{P}L(\omega_{l})\rho(\omega_{v}, \omega_{l})cos\theta_{l}\mathrm{d}\omega_{l}I=PL(ωl)ρ(ωv,ωl)cosθldωl

我们使用LTC对BRDF函数进行拟合,可得:

  1. I=∫PL(ωl)ρ(ωv,ωl)cosθldωl≈∫PL(ωl)D(ωl)dωlI = \int_{P}L(\omega_{l})\rho(\omega_{v}, \omega_{l})cos\theta_{l}\mathrm{d}\omega_{l} \approx\int_{P}L(\omega_{l})D({\omega_{l})}\mathrm{d}\omega_{l}I=PL(ωl)ρ(ωv,ωl)cosθldωlPL(ωl)D(ωl)dωl

这里我们假设多边形光源出射的radiance是一个常数,即L(ωl)=LL(\omega_{l}) = LL(ωl)=L,那么我们可以进一步简化:

  1. I=∫PL(ωl)D(ωl)dωl=L∫PD(ωl)dωlI = \int_{P}L(\omega_{l})D({\omega_{l})}\mathrm{d}\omega_{l} = L\int_{P}D(\omega_{l})\mathrm{d}\omega_{l}I=PL(ωl)D(ωl)dωl=LPD(ωl)dωl

我们再进行积分变换:

  1. ∫PD(ω)dω=∫PoDo(ωo)dωo=E(Po)\int_{P}D(\omega)\mathrm{d}\omega = \int_{P_{o}}D_{o}(\omega_{o})\mathrm{d}\omega_{o} = E(P_{o})PD(ω)dω=PoDo(ωo)dωo=E(Po)

对于一个余弦分布的半球面函数上的多边形积分是有表达式的,即:

  1. E(p1,...,pn)=12π∑i=1nacos(<pi,pj>)⟨pi×pj∣∣pi×pj∣∣,[001]⟩E(p_{1},...,p_{n}) = \frac{1}{2\pi}\sum_{i=1}^{n}acos(<p_{i},p_{j}>)\left \langle \frac{p_{i}\times p_{j}}{||p_{i}\times p_{j}||}, \begin{bmatrix}0\\ 0\\1\end{bmatrix} \right \rangleE(p1,...,pn)=2π1i=1nacos(<pi,pj>)pi×pjpi×pj,001

这里的j=(i+1)mod(n)j = (i+1)mod(n)j=(i+1)mod(n),注意将多边形光源进行变换后,要将光源进行上半球面的裁剪。

这里的证明就不再赘述了。

对于带着纹理的光源来说,作者给出的方法很奇怪,就不再讨论。

总结

对于这篇paper,将一种数学方法引入了图形学,是很不错的。

优点:

  • 对于简单多边形光源(矩形,三角形等)来说,对于场景的着色很快,效果很棒,误差小。

缺点:

  • 复杂多边形光源(心形等)的着色速度慢,已经很难达到实时。
  • 只能针对二维平面上的多边形光源。
  • 只能进行直接光照着色。

实现流程:

  1. 通过视口方向ωv,α\omega_{v},\alphaωvα进行采样LUT得到矩阵MMM。将面积光源进行旋转,即面积光源坐标系转变为以像素点为原点的局部坐标系。即构造一个TBN矩阵。
    mul(Minv, transpose(mat3(T, B, N)));
  2. 将世界坐标系下的面积光源的顶点变换。
  3. 裁剪多边形。
  4. 进行线积分。

这里给出LTC的网站,想了解更详细的内容可以看看哦!

对那充满不安的日子说再见吧,对那充满不安的日子说再见吧,
向着未知的梦境之地前行,向着未知的梦境之地前行,
我想总有一日我会变得更加坚强!我想总有一日我会变得更加坚强!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU Gems1 - 20 纹理爆炸(Texture Bombing)

【章节概览】 这章介绍了纹理爆炸&#xff08;Texture Bombing&#xff09;和相关的细胞技术&#xff0c;它们能在Shader中增加视觉的丰富性&#xff0c;图像的多样性&#xff0c;并减少大块纹理图案的重复性。 【核心要点】 纹理爆炸&#xff08;Texture bombing&#xff0…

Catlike Coding网站文章解析 -- 1.Procedural Grid

原文英文版链接https://catlikecoding.com/unity/tutorials/procedural-grid/&#xff0c;里面有每一部分的untiy工程链接&#xff0c;文章内容也更详实。 本章内容&#xff1a; 创建一系列点使用协程实现他们的摆放位置定义一个由三角形组成的平面自动生成法线添加纹理坐标和…

GPU Gems1 - 21 实时辉光(Real-Time Glow)

这章浅墨的文章讲的很细了&#xff0c;这里基本照扒一遍加深印象&#xff0c;原文链接&#xff1a;https://zhuanlan.zhihu.com/p/36499291 【章节概览】 这章讲到2D光照效果中的辉光&#xff08;Glow&#xff09;和光晕&#xff08;Halo&#xff09;&#xff0c;展示了如何通…

Catlike Coding网站文章解析 -- 2.Procedural Grid

本章内容 创建一个闭合的cube mesh给cube添加带弧度平滑的边缘定义法线使用sub-meshes&#xff08;子mesh&#xff09;创建一个常规shader合并碰撞体1.合成一个cube 上一章https://mp.csdn.net/postedit/89474068我们已经实现了一个平面mesh。一个cube由6个平面组成&#xff…

GPU Gems1 - 23 景深技术综述

本章主要介绍如何使用GPU创建实时的景深&#xff08;Depth of Field&#xff09;效果。参考浅墨总结文章的链接https://zhuanlan.zhihu.com/p/36499291 聚焦在枪上&#xff0c;背景模糊【核心要点】 物体在距离镜头的一个范围之内能够清晰成像&#xff08;经过聚焦&#xff09…

GPU Gems1 - 22 颜色控制(Color Controls)

这章将在游戏中图像处理的讨论&#xff0c;扩展到技术和艺术上控制颜色的方法和应用&#xff0c;包括将图像从一些的色彩空间中移入移出&#xff0c;以及快速地给任何2D或3D场景加上精美的色调。 色彩校正&#xff08;Color Correction&#xff09;是几乎所有印刷和胶片成像应…

GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

这章介绍在片元shader中计算导数近似值的技术。这个技术把特别的值载入纹理mipmap的每个级别&#xff0c;以特殊的方式使用纹理映射硬件&#xff0c;计算出导数的结果&#xff0c;给出在屏幕上的像素间某个量的变化率。 Cg标准程序库提供ddx和ddy函数&#xff0c;计算任意关于…

GPU Gems1 - 24 高质量的过滤

在一些应用中&#xff0c;高质量的过滤是至关重要的&#xff0c;可以用像素shader代码执行任何过滤。GPU着色程序不用于CPU的主要之处在于&#xff1a;一般来说&#xff0c;CPU数学操作比纹理访问更快&#xff0c;而在GPU中恰恰相反。图像过滤的目的很简单&#xff1a;对于给你…

GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

【章节概览】 这章中&#xff0c;大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和DrweHess介绍了OpenEXR标准&#xff0c;这是一种当时新的高动态范围图像&#xff08;HDRI&#xff09;格式&#xff0c;在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者…

ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

看GPU Gems2中的 使用基于GPU几何体裁剪图的地形渲染&#xff08;Terrain Rendering Using GPU-Based Geometry Clipmaps&#xff09;一文&#xff0c;对Clipmap技术不是理解很好&#xff0c;所以上网搜索一番&#xff0c;发现了这篇文章&#xff0c;实在是太棒的文章&#xff…

[知乎] 开放世界游戏中的大地图背后有哪些实现技术?

今天看到的一篇关于大世界的技术文章&#xff0c;写的太好了&#xff0c;膜拜大佬。各位如果有时间一定要看看 原文&#xff1a;http://gulu-dev.com/post/2014-11-16-open-world#toc_10 一、程序技术篇&#xff1a;算法和架构&#xff08;Programming Algorithms & Arch…

GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)

【章节概览】 本章描述了一种通过顶点纹理实现的&#xff0c;基于GPU的几何体裁剪图&#xff08;Geometry Clipmaps&#xff09;技术。通过把地形几何体当做一组图像来处理&#xff0c;可以在GPU上执行几乎所有的计算&#xff0c;因此可以减少CPU的负载。且该技术较为容易实现…

球谐光照

一.原理 球谐光照实际上是一种对光照的简化&#xff0c;对于空间上的一点&#xff0c;受到的光照在各个方向上是不同的&#xff0c;也即各向异性&#xff0c;所以空间上一点如果要完全还原光照情况&#xff0c;那就需要记录周围球面上所有方向的光照。注意这里考虑的周围环境往…

图像色调,饱和度,对比度等相关定义

RGB颜色模型 RGB颜色模型也就是我们最常用的三原色&#xff0c;红绿蓝。RGB颜色模型在混色时属于加法混色&#xff0c;RGB中每种颜色数值越高&#xff0c;色彩越明亮。RBG为&#xff08;0,0,0&#xff09;时为黑色&#xff0c;RGB为&#xff08;255,255,255&#xff09;时为白…

各Rendering Path技术以及其在Unity中的实现

Rendering Path其实指的就是渲染场景中光照的方式。由于场景中的光源可能很多&#xff0c;甚至是动态的光源。所以怎么在速度和效果上达到一个最好的结果确实很困难。以当今的显卡发展为契机&#xff0c;人们才衍生出了这么多的Rendering Path来处理各种光照。 一. 正向渲染Fo…

GPU Gems2 - 3 几何体实例化的内幕(Inside Geometry Instancing)

文章部分内容摘自 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章讨论了在Direct3D中渲染一个几何体的许多独特实例&#xff08;Instance&#xff09;的技术细节问题&#xff0c;对几何体实例&#xff08;Geometry Instancing&#xff09;的技术内幕进行了分析。 【…

GPU Gems2 - 4 分段缓冲(Segment Buffering)

文章参照该文 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章介绍了一项可以明显减少一个显示帧中渲染的批次数目的技术——分段缓冲&#xff08;segment buffering&#xff09;&#xff0c;以及其改进。 【核心要点】 分段缓冲&#xff08;segment buffering&…

GPU Gems2 - 6 用多流来优化资源管理(Optimizing Resource Management with Multistreaming)

本文摘自https://zhuanlan.zhihu.com/p/38411575 【章节概览】 现代实时图形应用程序最困难的问题之一是必须处理庞大的数据。复杂的场景结合多通道的渲染&#xff0c;渲染起来往往会较为昂贵。 首先&#xff0c;多流&#xff08;Multistreaming&#xff09;技术由微软在Dire…

GameObject数组逐渐消失

GameObject数组逐渐消失 我做了10个物体需要每隔俩秒消失一个。 我是这样做的&#xff1a; 我先梳理出大概我需要怎么做的&#xff0c;第一步先引用预制体然后再创建一个数组最后是代码主体。 在start里先把起始时间设好&#xff0c;然后再看Nos方法time是让他时间自己在加&am…

Unity SRP自定义渲染管线 -- 1.Custom Pipeline

该篇是对Catlike Coding这篇文章的概要总结&#xff0c;本人能力有限&#xff0c;如果有不正确的地方欢迎指正 https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/custom-pipeline/ 通过这篇文章&#xff0c;你将学习到 Create a pipeline asset and i…