Reflection BRDF通常是如何实现的?

Reflection BRDF通常是如何实现的?,reflection,graphics,render,raytracing,pbr,Reflection,Graphics,Render,Raytracing,Pbr,我有一个小的路径跟踪器,我正试图找出如何实现一些基本的BRDF。 以下是我使用的管道的简要描述(无递归): 因此,我在步骤1.1.1)中计算反射光线的方向,我构建了一条路径 现在,我已经实现了漫反射、镜面反射、光泽反射和折射。 现在我想实现一个复杂的BRDF,比如Cook Torrance BRDF。 我看到它包含几个组件(漫反射和镜面反射)。我应该如何追踪这些光线以获得组合?我应该在漫反射光线/镜面反射光线之间随机选择,然后像往常一样累积值(乘以某些系数)(例如,如果随机值大于0.5,则跟踪漫

我有一个小的路径跟踪器,我正试图找出如何实现一些基本的BRDF。 以下是我使用的管道的简要描述(无递归):

因此,我在步骤
1.1.1)中计算反射光线的方向,我构建了一条路径

现在,我已经实现了漫反射、镜面反射、光泽反射和折射。 现在我想实现一个复杂的BRDF,比如Cook Torrance BRDF。 我看到它包含几个组件(漫反射和镜面反射)。我应该如何追踪这些光线以获得组合?我应该在漫反射光线/镜面反射光线之间随机选择,然后像往常一样累积值(乘以某些系数)(例如,如果随机值大于0.5,则跟踪漫反射光线,否则为镜面反射),还是应该跟踪每个交点的多条光线

它通常是如何在基于物理的渲染器中实现的


如果有人知道一些关于这个话题的好文章,我会很高兴看到。我试着阅读pbrt,但它对我来说似乎非常复杂和庞大。有些东西的实现是不同的,比如相机模型和其他东西。

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

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


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

在我的随机跟踪器中,我为镜面反射和漫反射生成单独的光线,但是您上面概述的方法使光线树更小,并且应该减少计算复杂性。我曾考虑过使用这种方法,但我不知道如何使用“颜色”随机系数,以便漫反射和镜面反射之间的分割可以根据表面颜色而变化(我相信塑料和金属材料会发生这种情况)
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.