Chango的数学Shader世界(八)光盘模拟-各向异性,光栅衍射
目的:
参考《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世界(八)光盘模拟-各向异性,光栅衍射相关推荐
- Chango的数学Shader世界(七)水波模拟-透明水面,菲涅尔(Fresnel)效应
目的: 解析,改进,批评一个国外免费透明水面Shader,进一步了解Shader背后的物理原理. 参考: 菲涅尔反射 分析: 我将原水面Shader一再简化,从中抽取最主要的部分,忽略细枝末节,并改掉 ...
- Chango的数学Shader世界(九)流体模拟-散度,梯度,二阶导与拉普拉斯
目的: 参考<GPU Gems>,在UE4中尝试重现2D流体模拟. 本节试图结合场论知识粗略理解Navier–Stokes equations. 参考: <GPU Gems> ...
- Chango的数学Shader世界(十四)细线间断,发光闪烁,TAA削弱处理
目的: 减少游戏中的细线因屏幕分辨率不足和算法采样不足问题,导致的间断,以及相对的自发光闪烁.解决了此问题也附带解决了因TAA导致的细线自发光微弱的问题. 对比视频:https://www.bilib ...
- Chango的数学Shader世界(十五)油画Shader-技术分析,教程纠错
目的: 实现油画后期Shader,探究教程中技术细节,指出错误. 参考: 搜索ue4 paint filter. UE4.21后整合自定义usf 观察: 油画的特点:成块的色块,但又保持清晰的边缘. ...
- 数学建模优化和仿真模拟的区别001
如果我们过于爽快地承认失败,就可能使自己发觉不了我们非常接近于正确!---卡尔·波普尔 数学建模优化和仿真模拟的区别 几十年来,工程师们一直使用模型(Model)来帮助他们理解系统过程并确定最佳解决方 ...
- 吴文俊: 中国古代数学对世界文化的伟大贡献
公元前221年, 秦始皇灭六国, 建立了中国历史上第一个中央集权的封建国家. 汉承秦制, 自秦至西汉中期这两百来年间, 是新兴地主阶级专政巩固发展与上升的时期, 法家路线占着主导地位. 法家对工农业生 ...
- 中国石油大学《大学英语(三)统考》第八套模拟题
第八套模拟题 单选题 (共25道题) 收起 1.(4.0分) 1.- Sorry to have kept you waiting. - _________ A.That's OK. B.What a ...
- c语言质数和合数事例,新人教版三年级数学下册第八单元单元教学计划
第八单元 数学广角--搭配 (二) 新知识点: 1.简单事物的排列数. 2.简单事物的组合数. 教学要求: 1.联系学生的生活实际,使学生通过观察.猜测.试验等活动,找出简单事物的排列数和组合数. 2 ...
- 为什么要深入数学的世界
为什么要深入数学的世界 作为计算机的学生,我没有任何企图要成为一个数学家.我学习数学的目的,是要 想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些.说起来,我在刚来这个学校的时 ...
最新文章
- R语言ggplot2可视化箱图(boxplot)时忽视异常值(outlier)并重新分配坐标轴的范围是的可视化的箱图可以有效显示箱体实战
- Linux下which、whereis、locate、find 命令的区别
- php连接MYSQL(2)
- 详解Kafka与ActiveMQ的区别与联系!
- netcore 编译 html,Asp.Net Core中的@ Html.Action
- 工作211:新的封装组件 秒呀
- 命令行shell 用于SQLite
- 如何解决分布式系统数据事务一致性问题(HBase加Solr)
- 使用cacti监控CISCO交换机
- shell 结束指定端口
- 【拆书】9000字总结,一文掌握737页程序员圣经《深入理解计算机系统》(第三版)重点
- Android好用的音乐,安卓手机音乐播放器哪个好用?十大最好音乐播放器介绍
- 小明左右手分别拿两张纸牌:黑桃10和红心8,现在交换手中的牌。编写并输出互换后的结果
- 网络爬虫法即将出台!!!小爬怡情,大爬over
- hdu 1564 paly a game(博弈论找规律)
- Python模块字典
- Vysor 安装教程
- 有36匹马,六个跑道,用最少的次数选出最快的前3匹马
- 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】新起点之FPGA开发指南_V2.1
- 【Mysql上分之路】第三篇:Mysql安装与配置、目录结构
热门文章
- paper—HAWK: Rapid Android Malware Detection Through Heterogeneous Graph Attention Networks
- Theia学习笔记(二)
- 电子科技大学计算机16级公示,物光院关于受理2021年博士学位申请工作的通知
- C# 电脑上提示未知发布者
- 大众集团「下注」本地化
- python可视化界面自动生成_python生成界面
- imageNet2015,港中大汤晓鸥教授团队超越谷歌破互联网物体检测世界纪录
- 无法直视之纳税额计算器
- 时钟失效之后,STM32还能运行?
- 【RPG Maker MV】RPG游戏《机器人养成记》制作笔记 - 制作背景和引擎选择