Weekly22/9/25

在这周看了如下:

  • 微表面模型补完
    • 对于diffuse的BRDF:Lambertian,Oren-Nayar
    • 对于Specular的BRDF:Cook-Torrance
    • 对于Glossy的BRDF:Ashikhmin-Shirley
  • 光谱,XYZ,RGB的转换;实现细节
  • MonteCarlo(部分,就是基础蒙特卡洛
  • 还有许多细节的东西
  • C++语法相关

把这些都列出来了,突然发现自己也才学了一点点......呜呜太拉了
这周最大的问题是我在光谱那部分花了太多时间,一直担心如果光谱类不实现可能导致后续的工作做不...后面发现我多虑了,事实上PBRT默认RGB为光谱,用RGB照样算。

有疑惑的部分

  1. Cook-Torrance假设表面是即存在镜面反射,又存在漫反射,但是每次只能对一个光线进行采样,那怎么同时计算漫反射和镜面反射呢 (赋予一个折射/漫反射权重么?Scattering pdf? 在ch Material里看到了一个参数,是否允许多重lobes,感觉就是问题的答案了,准备接着看ch14)
  2. 蒙特卡洛的pdf选择 (Cos-weighted?根据微表面选择pdf?)
  3. 如何对光源进行采样,光源的pdf怎么计算?(接着看MIS,目前不急)

参考

Spectral Cpmputation of XYZ,这个网站上还有很多关于色彩空间的知识
chap05_color_radiometry ,TWU的课件,帮我稍微理清了下代码的思路(别问我咋找到的
PBRT - Spectral Representation,兜兜转转发现还是PBRT讲的好
PBRT - Sampling Random Variables,里面感觉有用的是cos-weighted采样,其他的都没看咋...
PBRT - Microfacet Models,微表面模型补完
Fresnel Incidence Effects

计划看的

PBRT - Light Sources,基于物理的渲染需要基于物理的光源,这部分必须看
PBRT - Sampling with Multidimensional Transformations,这里有点没看懂,下周必须要搞懂了呃
PBRT - Light Transport I: Surface Reflection,这部分很重要,估计是渲染主逻辑

额外参考

Digital Image Synthesis, Fall 2016
CSE 168: Rendering Algorithms
IMAGE SYNTHESIS TECHNIQUES - 作者本尊开课

民科笔记

pbr(可能有错误)

光谱类实现

光谱转换到RGB的最好方式是先转换到XYZ,再转换到RGB....
光谱转换到XYZ的公式为

就是在可见光范围内对这两个函数的乘积进行积分
P是SPD曲线,光谱功率分布函数,光谱在哪个波长的功率是多少;x,y,z是CIE定义的响应曲线,指的是人眼中不同的视锥细胞对光谱的敏感度..
PBRT记录x,y,z响应曲线的方法是在特定光谱范围内进行了预采样,每个采样区间为1nm。ps:我不知道为毛没有找个函数近似..莫非是为了精度么
先把光谱范围里的波长均匀分成nSpectralSamples个区间,对每个区间上的SPD计算积分,分波段记录在数组里...
还要把xyz响应曲线在对应区间里的积分算出来,当然这一步是程序开始运行就做好的,只会运行一次...
然后需要XYZ的时候就把SPD积分数组里的值乘以对应波段上的x,y,z积分值,相加.
那么如此一来就成了这个式子

其中Xi就是响应曲线在nSpectralSamples个区间上进行积分的值,ci是SPD的积分值...所以就是一个黎曼积分和
最后还要把x,y,z除以一个缩放系数:对y响应曲线在整个光谱上的积分,一个定值。为什么要这么干网上的版本里没提(我手里的书也没提,但是把这个缩放系数直接乘在了公式上)
这基本就是PBRT SampledSpectrum类的思路了
至于转到RGB,只需要把xyz值乘以变换矩阵就行了
但是最最amazing的当属从RBG值转换成SampledSpectrum的代码,看得我肚子痛....
光谱类的基类为CoefficientSpectrum,它有一个模板参数int nSpectrumSamples,就是上面提到得区间数量。在类中存放了一个长度为nSpectrumSamples数组c。其派生类SampledSpectrum是一个通用的类,可以从它转换成RGB,光谱,XYZ,如其名,这个类里一般存放了采样的结果,例如其静态对象X,Y,Z分别存放了在nSpectrumSamples个区间上对XYZ的响应曲线进行积分的结果。
当然这些不重要,因为我不打算实现了

END