在这周看了如下:
把这些都列出来了,突然发现自己也才学了一点点......呜呜太拉了
这周最大的问题是我在光谱那部分花了太多时间,一直担心如果光谱类不实现可能导致后续的工作做不...后面发现我多虑了,事实上PBRT默认RGB为光谱,用RGB照样算。
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 - 作者本尊开课
光谱转换到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的响应曲线进行积分的结果。
当然这些不重要,因为我不打算实现了