序
太极图形课S1第07讲:光线追踪实战_哔哩哔哩_bilibili
没有代码,还是上一节的代码
看了别的大佬写的很多好看的图形学程序,就有那么一种感觉——我这个小白之所以这么白,全方位的白,是因为没有相关的数理知识作核。而图形编程只是一层壳,是次要方面。
抓不到主要方面,当然白啦!
不过,如果我要是能学得会数理知识,我高考能考成那样吗……
已经习惯被大佬按在地上去摩擦了……不习惯又能怎么样呢?就不是那块料。。
就这样吧,凑凑热闹,感动一下自己……自我感动形学习……
自我感动形学习也比自我放弃形躺平要好听一点,至少学了一点,万一学的这一点以后用上了呢?
正文
绕过辐射度量学,说清楚光线到底追到了什么颜色
回顾
图形学的这个图形的颜色,其实是颜色+亮度
- 颜色:可以当成一个过滤器,比如白光射入红墙,反射以后,多余的颜色被过滤,就只剩了红光
- 强度:严格来说,应该叫辐照度,能量,单位立体角什么的,流明
- 光追,多次反射,那就多乘几次【弹幕:亮度是有单位的,连乘之后量纲就不对了,颜色可以被认为是个过滤器/衰减器】
代码
问题的提出
今天主要看“实现”,实现的话,就有这么几个问题:
如何发射光?
如何计算光线与物体的交点?
漫反射表面,介电质表面,如何取光线的方向?
如何化递归为非递归?
如何反走样?
正式开始:
问题1——如何发射光?
一条直线,可以按射线来定义
定义了很多值:
发光:
可以按像素中心算,不一定都要按左下角来算
问题2——如何计算光线与物体的交点?
解方程。。
都定义成数学,然后计算
联立,解方程
射线与球的交点的计算,可能会计算出一些奇奇怪怪的东西
比如,两个正根,一正一负,两个负根
取最小的那个正根就行了
把这些东西具体实现出来,是这个:、
会发现,结果很奇怪
为什么?
因为数学上的理论计算,和实际上的硬件实现,有时候不大一样。
理论计算:【0,2】的时候,取最小的正根——取2,和第二个球相交,没毛病
硬件实现:【0.0001,1.9999】的时候,取最小的正根——取0.0001,和自己相交,凉凉……
【弹幕:因为有靠近0的根的时候,因为数值精度问题,会偶尔返回给你一个正根,偶尔返回一个负根(都很小),就会出现相交判定时灵时不灵】
解决方法——把最小的正根,改成,最小的大于0.001的根
【弹幕:有一个trick是计算求交时把射线起点稍微往后退一点。——这玩意原来用过的】
然后,这个问题就可以解决了
还有个问题,墙壁如何求交?——其实,这个所谓的平面墙壁,是半径很大的几个球的一部分
正规的,与平面求交应该这么计算:
有了平面以后,还可以再扩展,扩展到与三角形求交
因为,三角形总是在某个平面上的
重心坐标,面积关系,可以判断某点是否在三角形内,与上面的结合一下,就完成了射线与三角形的求交
与三角形求交,有这么个应用:
问题3——如何采样
新的坐标系的定义:
可以均匀采样一个球
忽略R=1,三维球坐标就转化成了二维坐标,把这些二维散点映射到球上的时候,两极的点会密一些
所以,地球仪的两极,看着比较虚大。
重新定义球的均匀采样:
推导看不懂可以忽略。。
最后结果是这个:
θ在赤道多采一些,在两极少采一些
球体里采样,R也要变,才能保证采样是均匀的
【弹幕:为啥要对r采样开三次方,0~1之间随机不行吗】
【如果不开三次方会采出中心采样多,外面采样少的情况。】
【概率密度函数,求法很简单, 讲实际分布函数取逆函数就好了。 了解这个知识的人的确很少】
【想象一个半径为r的球,把它的半径增加微小量dr之后,球体体积的变化量和r^3成正比】
还有另一种方法:按方块采样,不按球采样,简单一点
结束了吗?
够用,但是还可以再改
加点权重?
【成正比的线性函数,算来算去后,对密度函数的调整就是求开方。】
球面上采样,再投影回去
【学会放弃……】
在球体里采样,和在球面上采样
这玩意,不好调试
问题4——反射与折射与介电质
全反射。。
还有个问题——反射和折射,都占多少?
【菲涅尔效应】
数学公式……
和入射角,两个光疏光密介质有关
整合一下:
问题5——递归
函数调用与递归工作栈
尾递归,和ray trace差不多……可以改成循环
不用手动维护一个堆栈了
然后,按这个原理来改写:
大概是这么个流程
问题6——抗锯齿反走样
这个就叫锯齿
可以这么搞,多采样几次
效果
光线跟踪到光源的时候,才能知道它是什么颜色
所以,可以摄像机,光源,两头一起计算。。
还是大神。。
讲path trace代码的一个环节
太极图形课S1第07讲:光线追踪实战_哔哩哔哩_bilibili
这还有一个模拟太阳系的大佬
太极图形课S1第07讲:光线追踪实战_哔哩哔哩_bilibili
我能模拟小白。。因为我就是小白。唉……