BRDF通常是如何实现的?
How is BRDF usually implemented?
我有一个小型路径追踪器,我正在尝试弄清楚如何实现一些基本的 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 为每个交点计算一条镜面反射光线和一条漫反射光线,以及 returns 一条新光线,其方向是计算的镜面反射光线的 60% 和计算的镜面反射光线的 40% 的线性插值计算出的漫射光线。
我有一个小型路径追踪器,我正在尝试弄清楚如何实现一些基本的 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 为每个交点计算一条镜面反射光线和一条漫反射光线,以及 returns 一条新光线,其方向是计算的镜面反射光线的 60% 和计算的镜面反射光线的 40% 的线性插值计算出的漫射光线。