BRDF通常如何实施?

时间:2016-10-26 19:31:14

标签: reflection graphics render raytracing pbr

我有一个小路径跟踪器,我试图弄清楚如何实现一些基本的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,但这对我来说似乎非常复杂和巨大。有些东西的实现方式不同,比如相机模型和其他东西。

1 个答案:

答案 0 :(得分:1)

第一步可能是让你的BRDF决定射线应该反弹的方式。如果它是多种方法的组合,则将BRDF中的概率分配给每个方法,然后让BRDF根据给定的概率选择一个。

例如,假设您想要一个BRDF,它是镜面反射和漫反射的组合。当您实例化BRDF时,您可能会告诉它您需要60%镜面反射和40%漫反射。然后,当您的路径跟踪器查询BRDF以获得反射光线方向时,BRDF可以在内部计算60%的镜面反射光线和40%的漫射光线。

编辑 - 另一种可能更准确的方法是让BRDF使用提供的概率通过在两种方法之间进行插值来生成反射方向。在上面的示例中,当查询时,BRDF为每个交点计算镜面反射光线和漫反射光线,并返回一条新光线,其方向是计算的镜面反射光线的60%和计算的漫反射光线的40%的线性插值。