目的:

参考《GPU Gems》,在UE4中尝试以重现光盘Shader,并对书中的方法进行解析,改进,批评。

参考:

《GPU Gems》

观察:

我越来越意识到观察现实的重要性。

相机和肉眼看到的衍射图案有差别,会多出一些彩虹,很可能是光盘衍射出来的光在相机上发生了类似衍射的现象。

大致的X型图案

有些角度形成的收缩圆弧和放射圆弧图案

分析:

显然与实际效果有差距,这里面有不少原因。我们从原理分析到实现。

简单说,此Shader由两部分组成:各向异性高光+光栅衍射

1.各向异性

这是个十分宽泛的词语,顾名思义。在图形学上通常指从不同方向看,颜色不一样。至于怎么不一样,随便。

所以下面采用什么样的公式,都无所谓,能看就行。

《GPU Gem》提供的公式:

其中

是的,不像光照模型中的H,这个向量没有除以2,也没有归一化。算咱们善于变通,接受你先。

注意:类似之前的改写,我改写了冗余部分,但公式本身不变。

其中hiliteColor不知道是哪国语言,我猜出来了,意思为背景色,即各向异性高光材质的底色。

看公式要从外向里看,我们接下来看到函数:

用Geogebra或者Mathematica画图,其图像为:

只要注意到其特征,也就是x越接近0,y越为1。也就是说,咱公式里面的自变量越为0,这个各向异性高光就越好。

再看

可以看出,由于我们视角的变化,导致V变化,H变化,也在变化,那么确实这是各向异性的。

分母这部分其实可以不要,差不多就能看了:

(左:无分母项 右:有分母项)

分母干了件什么事呢?当我们的H尽力向N靠时,分母越为1。反之分母趋向0,则式子趋向无穷,y趋向0。

可以看成,在空间的另一个方向上,也作了各向异性。

(因为空间中让一样的H,有无数个,H的另一端点形成一个竖直的圆,有了分母,在圆上各点都不同,这样此点在整个空间的每一个方向上,基本上都是不同的(忽略分子分母比恰好相同的情况))

沿着某个方向移动,无分母项材质各向异性高光基本不变。

相比之下,右边的有分母项在同样的方向上,各向异性高光也在变化。

再看的左边k。当k越大,图上的高光带就越窄,为什么?

高光带都是自变量接近于0的地方,先忽略分母,也就是接近于0的地方。当H固定,那些切线必须十分垂直于H,才能高光。注意到光盘模型的切线方向,是绕着圆周的:

当k越大,比如5。原来自变量0.4,现在变成了2,则y从接近1变成了接近0。

换句话说,只有更加垂直于H的T的那些顶点,才有高光了。带子所以细了。

阶段总结:

现实中的各向异性材质不尽相同,包括光盘,这个公式十分随意,所以也不能保证和现实一致,能看就行。

2.光栅衍射一:假设平面波

《GPU Gems》给出的衍射模型基于光波是平面波,也就是理想的平行光。但从我的中文翻译版来看,书上一段话好像有错误:

“从一个光源发射的光波通常近似于平面波”。这是错的,不知道是原作者拉基还是译者拉基。

为什么?平面波这个词有两个意思

“平面波”意思1:

来源于麦克斯韦方程组(Maxwell Equations)。只有是B和E相互垂直的电磁波,就是平面波,如果是这个概念,那不能说“近似”。

我们又一次碰到了这个东西:麦克斯韦方程组

PS:

我的学习哲理:重要的东西不必追寻,因为它太重要了,它总会出现在你眼前。

同样的,为了了解麦克斯韦方程组,我发现b站上李永乐老师讲解其积分形式很清楚易懂。在这之前,已经有2,3个人向我推荐这个up主了,但我没看。然而,我还是遇到他了。(当然,这只是大致解释了其积分形式。结合场论/向量微积分等,其内容不是那么简单)

并且了解到,其有一个重要的推论,电磁波的电场矢量,是一个完美的Cos/Sin波:

所以我说,我们在水波模拟中详细研究的Sin波,是图形学中基础的基础,它会一次又一次地出现。

并且,没有这个推论,就没有我们之后的光栅衍射近似模型。

“平面波”意思2:

波阵面的形状是平面波

要了解为什么平行光又称为平面波,先了解声波上球面波等其他形式的波:

显然,在近处点光源是球面波。只有像太阳这种,距离远又大,到地面上十分近似平面波了。

所以说,书上这句话,十分误导人。书上平面波的意思,应该是指波阵面是平面波,也就是平行光。之后的光栅衍射近似模型我们会看到这一点。

最后,我们得出,我们的Shader,只适用于平行光场景。

3.光栅衍射二:微小的表面发生衍射

就像缓慢的水流经过桥洞,当表面细节比可见光波波长(《GPU Gems》这里取近似,紫到红)大得多时,不会发生衍射。

但当水波经过小孔时,就不一样了:

这在初高中物理上见过的知识,但推导起来好像并不容易。

这让我想起了证明任意形状薄片在水面震动,最后总形成圆形波的数学推导,我反正还没到能看懂的水平:

所幸《GPU Gems》上这篇作者智商和我们差不多(?),简化了模型:

接下来就引入一个简化很强的假设:

对于两条平行光束,只有波长一致,且相位差等于波长整数倍,才能进入我们眼中:

所以我们的Shader,在细节处,很可能与完美物理模拟差不少。

根据两波相位差为波长整数倍可知,同样的路径,两光程之差为波长整数倍。有公式:

其中:

,

注意:避免冗余,符号已改

n为任意正整数,为符合条件的波长。

证明:

我采用和以前类似的简化性证明,证明从红色面出发,到绿色面结束的两路程差(也就是两条红绿端点线长度差)=

十分容易,证明细节略。

又由于可见光波长属于[0.5,1],得n值范围[ud,2ud]。

根据这个范围限制,又可得出在范围内的可见光波长:

这样,我们最终的衍射颜色就可由伪代码给出:

for(int n=ceil(ud);n<=floor(2ud);n++)
{
c+=Color(ud/n);
}

其中Color函数接受波长,返回该波长对应的RGB颜色

再加上之前的各向异性高光,就是最终颜色。

4.批评:符号混乱,代码与理论不符

《GPU Gems》上对应实现的CG代码,与理论不符,而且符号混乱。u在理论中是u0,在代码中u=u0*d。

而且实现u的方案也不对。我们记得:

而代码中的实现是:

这不一定正确,为什么?举一个反例:

,错误。

可以说,这篇文章的理论和实现真是“两头放p”

这样计算的u,会带来光盘的x型形状:

还有个问题,根据我们之前的理论推导,n值范围[ud,2ud]。结果在代码中,他直接给了[1,8],还要说什么受程序限制。我看是因为根据理论推导出来的Shader实在太丑了,还不如直接给个[1,8]好看,咱就当一个超人呗,看看可见光之外的光。

(理论版本,颜色分割明显)

(1-8版本,颜色变化连续)

当然,我们由于收到UE4 Shader框架的限制,只能把衍射颜色直接给BaseColor,再走它的渲染管线,出来的光强不正常,没有它的效果绚丽

5.批评二:彩虹函数,UE4的HLSL

理论推导时我们说到需要一个彩虹函数Color,接受参数为波长,返回为rgb颜色。

将波长[0.5,1]重新映射到[0,1],再对应一个r,g,b三根曲线函数图,即可。

《GPU Gems》这篇的实现,既复杂,又拉基,从上面截图你也可以看出它的衍射图看不见紫色光,不说了。

我在实现的时候本想直接从Texture读取,省的造函数。但UE4的Custom节点,又出了bug,在循环里读取tex颜色莫名其妙报错无限循环,不读取tex就一切正常。无奈我们没有自己的一套渲染管线,以后有机会研究。这里直接参考网上,数学实现彩虹函数:

结语

本篇参考《GPU Gems》,在UE4中尝试以重现光盘Shader,并对书中的方法进行解析,改进,批评。

我们看到了尊重物理事实,将理论与实践结合的重要性。

Chango的数学Shader世界(八)光盘模拟-各向异性,光栅衍射相关推荐

  1. Chango的数学Shader世界(七)水波模拟-透明水面,菲涅尔(Fresnel)效应

    目的: 解析,改进,批评一个国外免费透明水面Shader,进一步了解Shader背后的物理原理. 参考: 菲涅尔反射 分析: 我将原水面Shader一再简化,从中抽取最主要的部分,忽略细枝末节,并改掉 ...

  2. Chango的数学Shader世界(九)流体模拟-散度,梯度,二阶导与拉普拉斯

    目的: 参考<GPU Gems>,在UE4中尝试重现2D流体模拟. 本节试图结合场论知识粗略理解Navier–Stokes equations. 参考: <GPU Gems> ...

  3. Chango的数学Shader世界(十四)细线间断,发光闪烁,TAA削弱处理

    目的: 减少游戏中的细线因屏幕分辨率不足和算法采样不足问题,导致的间断,以及相对的自发光闪烁.解决了此问题也附带解决了因TAA导致的细线自发光微弱的问题. 对比视频:https://www.bilib ...

  4. Chango的数学Shader世界(十五)油画Shader-技术分析,教程纠错

    目的: 实现油画后期Shader,探究教程中技术细节,指出错误. 参考: 搜索ue4 paint filter. UE4.21后整合自定义usf 观察: 油画的特点:成块的色块,但又保持清晰的边缘. ...

  5. 数学建模优化和仿真模拟的区别001

    如果我们过于爽快地承认失败,就可能使自己发觉不了我们非常接近于正确!---卡尔·波普尔 数学建模优化和仿真模拟的区别 几十年来,工程师们一直使用模型(Model)来帮助他们理解系统过程并确定最佳解决方 ...

  6. 吴文俊: 中国古代数学对世界文化的伟大贡献

    公元前221年, 秦始皇灭六国, 建立了中国历史上第一个中央集权的封建国家. 汉承秦制, 自秦至西汉中期这两百来年间, 是新兴地主阶级专政巩固发展与上升的时期, 法家路线占着主导地位. 法家对工农业生 ...

  7. 中国石油大学《大学英语(三)统考》第八套模拟题

    第八套模拟题 单选题 (共25道题) 收起 1.(4.0分) 1.- Sorry to have kept you waiting. - _________ A.That's OK. B.What a ...

  8. c语言质数和合数事例,新人教版三年级数学下册第八单元单元教学计划

    第八单元 数学广角--搭配 (二) 新知识点: 1.简单事物的排列数. 2.简单事物的组合数. 教学要求: 1.联系学生的生活实际,使学生通过观察.猜测.试验等活动,找出简单事物的排列数和组合数. 2 ...

  9. 为什么要深入数学的世界

    为什么要深入数学的世界 作为计算机的学生,我没有任何企图要成为一个数学家.我学习数学的目的,是要 想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些.说起来,我在刚来这个学校的时 ...

最新文章

  1. R语言ggplot2可视化箱图(boxplot)时忽视异常值(outlier)并重新分配坐标轴的范围是的可视化的箱图可以有效显示箱体实战
  2. Linux下which、whereis、locate、find 命令的区别
  3. php连接MYSQL(2)
  4. 详解Kafka与ActiveMQ的区别与联系!
  5. netcore 编译 html,Asp.Net Core中的@ Html.Action
  6. 工作211:新的封装组件 秒呀
  7. 命令行shell 用于SQLite
  8. 如何解决分布式系统数据事务一致性问题(HBase加Solr)
  9. 使用cacti监控CISCO交换机
  10. shell 结束指定端口
  11. 【拆书】9000字总结,一文掌握737页程序员圣经《深入理解计算机系统》(第三版)重点
  12. Android好用的音乐,安卓手机音乐播放器哪个好用?十大最好音乐播放器介绍
  13. 小明左右手分别拿两张纸牌:黑桃10和红心8,现在交换手中的牌。编写并输出互换后的结果
  14. 网络爬虫法即将出台!!!小爬怡情,大爬over
  15. hdu 1564 paly a game(博弈论找规律)
  16. Python模块字典
  17. Vysor 安装教程
  18. 有36匹马,六个跑道,用最少的次数选出最快的前3匹马
  19. 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  20. 【Mysql上分之路】第三篇:Mysql安装与配置、目录结构

热门文章

  1. paper—HAWK: Rapid Android Malware Detection Through Heterogeneous Graph Attention Networks
  2. Theia学习笔记(二)
  3. 电子科技大学计算机16级公示,物光院关于受理2021年博士学位申请工作的通知
  4. C# 电脑上提示未知发布者
  5. 大众集团「下注」本地化
  6. python可视化界面自动生成_python生成界面
  7. imageNet2015,港中大汤晓鸥教授团队超越谷歌破互联网物体检测世界纪录
  8. 无法直视之纳税额计算器
  9. 时钟失效之后,STM32还能运行?
  10. 【RPG Maker MV】RPG游戏《机器人养成记》制作笔记 - 制作背景和引擎选择