我有一个小的路径跟踪器,我试图弄清楚如何实现一些基本的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,那么我将跟踪漫射射线,否则-镜面反射)还是应该跟踪多条射线从每个路口?
通常在基于物理的渲染器中如何实现?
P.S.如果有人知道有关此主题的一些好文章,我将很高兴看到它们。我尝试阅读pbrt,但对我来说似乎非常复杂且庞大。某些地方的实现方式有所不同,例如相机模型和其他东西。
最佳答案
第一步可能是让您的BRDF决定射线应如何反射。如果是多种方法的组合,请在BRDF中为每种方法分配一个概率,然后让BRDF根据给定的概率选择一个。
例如,假设您需要结合镜面反射和漫反射的BRDF。实例化BRDF时,您可能会告诉您要60%的镜面反射和40%的扩散。然后,当路径跟踪器查询BRDF以获取反射射线方向时,BRDF可以在内部计算60%的时间的镜面射线和40%的时间的散射射线。
编辑-另一种可能更准确的方法是让BRDF使用所提供的概率通过在两种方法之间进行插值来生成反射方向。在上面的示例中,当查询时,BRDF计算每个交点的镜面射线和漫射射线,并返回一条新射线,该射线的方向是线性插值,该线性插值是所计算的镜面射线的60%和所计算的散射线的40%。