我有一个小的路径跟踪器,我正试图弄清楚如何实现一些基本的brdf。下面是我使用的管道的简要描述(没有递归):
1) For each pixel:
1.1) For each sample:
1.1.1) I construct a path.
1.1.2) I calculate the contribution of this path.
1.1.3) I calculate the "probability" of this path.
1.1.4) Finally, I calculate the overall color value(taking into account number of samples, "probability" and contribution of the path).
1.2) Take the sum of all samples' values and write it to the pixel.
因此,我计算了步骤1.1.1) I construct a path
中反射光线的方向。
现在,我已经实现漫反射,镜面反射,光滑反射,折射。现在我想实现一个复杂的BRDF,假设是Cook-Torrance BRDF。我看到它包含几个组件(漫反射和镜面反射)。我该如何追踪这些光线来得到组合呢?我应该在diffuse_ray/specular_ray之间随机选择,然后像往常一样累积值(乘以一些系数)吗?(比如,如果一个随机值大于0.5,那么我跟踪漫射光线,否则-镜面)或者我应该从每个交叉点跟踪多条光线?
它通常在基于物理的渲染器中是如何实现的?
注:如果有人知道一些关于这个话题的好文章,我会很高兴看到他们。我试着去读,但它对我来说似乎非常复杂和庞大。有些东西的实现是不同的,比如相机模型和其他东西
第一步可能是让BRDF决定光线应该如何反射。如果是多种方法的组合,则在BRDF中为每种方法分配一个概率,然后让BRDF根据给定的概率选择一个方法。
例如,假设你想要一个BRDF,它是镜面反射和漫反射的组合。当你实例化BRDF时,你可能会告诉它你想要60%的镜面和40%的漫反射。然后,当路径跟踪器查询BRDF以获得反射光线方向时,BRDF可以在内部计算60%的镜面光线和40%的漫射光线。
编辑-另一种可能更准确的方法是让BRDF使用提供的概率通过在两种方法之间插值来生成反射方向。在我们上面的例子中,当被查询时,BRDF为每个交点计算一条镜面光线和一条漫射光线,并返回一条新光线,其方向是计算的镜面光线的60%和计算的漫射光线的40%的线性插值。