首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >渲染方程- brdf / pdf > 1?

渲染方程- brdf / pdf > 1?
EN

Computer Graphics用户
提问于 2022-01-17 00:03:41
回答 1查看 401关注 0票数 2

我正在创建一个路径追踪器,在计算光的强度时得到了一些奇怪的结果。

我使用的是一个由这个图表启发的渲染方程:

  1. 当我使用余弦时,一切都变得非常黑暗,我的球体边缘几乎是黑色的。这是合理的,因为我几乎乘以cos(PI/2) = 0。我读到它应该用一些东西来抵消,所以我删除了它,这是有帮助的。但是它用什么来抵消呢?
  2. 我使用Lambertian漫反射BRDF,这意味着方程的"Fr“部分应该是”反照率/ PI“。我也在做均匀的半球取样,这给了我一个PDF 1/ PI。现在,当我计算BRDF / PDF时,我得到了"2 *反照率“。这似乎不对。这意味着,我越多地反弹,光的影响就越大,这是无稽之谈。第三次反弹的光线比第一次反弹时的光线要暗一些。我在哪里犯了个错误?

编辑1:我包括了伪代码。余弦是点积。在布恩之后,有一些东西我没有包括在内,因为它们对方程没有贡献。

代码语言:javascript
复制
<!-- language: lang-cpp -->
//Initialization
Ray ray;
float3 passthrought = (1,1,1);
float3 color = (0,0,0);

//Bouncing
for(int I = 0; i < 4; i++){
    Object obj = ray.intersect(...);

    color += obj.emission * passthrought;

    float3 newDirection = sample_hemisphere();
    float pdf = 1 / (2 * PI);
    float3 brdf = obj.color / PI; 

    if(pdf > EPSILON)
        passthrought *= dot(normal, newDirection) * brdf / pdf;
    else
        passthrought *= 0;

    //Prepare new bounce
    ray.origin = ray.direction * ray.distance + ray.origin;
    ray.direction = newDirection;
}


float3 sample_hemisphere(){
    //Tranformation to world space
    float3 w = ray->worldNormal;
    float3 axis = fabs(w.x) > 0.1f ? (float3)(0.0f, 1.0f, 0.0f) : (float3)(1.0f, 0.0f, 0.0f);
    float3 u = normalize(cross(axis, w));
    float3 v = cross(w, u);

    //Sampling from 2 random variables <0, 1>
    float e1 = rand();
    float e2 = rand();

    float s = sqrt(1.0 - e1 * e1);
    float phi = 2 * M_PI_F * e2;

    return normalize(u * cos(2 * M_PI_F * e2) * s + v * sin(2 * M_PI_F * e2) * s + w * e1);
}

编辑2:我只想在两个变体中加入一个呈现示例,不知怎么的,它现在起作用了。物体周围的黑色边框消失了。我想我得用正常的余弦和光线来计算,这是错误的。无论如何,我包括2渲染一个与一个余弦的正常和外向射线和一个没有它。请记住,白点设置为最大亮度的Reinhard色调映射和1/2.2的伽马校正是适用的。其中哪一个更正确?

用余弦:

没有余弦(因为它有大约10倍的样本):

EN

回答 1

Computer Graphics用户

回答已采纳

发布于 2022-01-31 17:05:46

当我使用余弦时,一切都变得非常黑暗,我的球体边缘几乎是黑色的。这是合理的,因为我几乎乘以cos(PI/2) = 0。我读到它应该用一些东西来抵消,所以我删除了它,这是有帮助的。但是它用什么来抵消呢?

这个余弦有几何意义,保留它,或者如果你去掉它,一定要有数学上的理由去做。掠角对地表的辐射分布较小,在90°时,接收到的辐射为零。

我使用Lambertian漫反射BRDF,这意味着方程的"Fr“部分应该是”反照率/ PI“。我也在做均匀的半球取样,这给了我一个PDF 1/ PI。现在,当我计算BRDF / PDF时,我得到了"2 *反照率“。这似乎不对。这意味着,我越多地反弹,光的影响就越大,这是无稽之谈。第三次反弹的光线比第一次反弹时的光线要暗一些。我在哪里犯了个错误?

概率密度函数p,按其定义,在整个定义集上必须有一个1的积分,因此在半球上。如果你算算的话,你会得到:

\int_\Omega p \, \text{d}\Omega = \int_0^{2\pi} \int_0^{\pi/2} p \, \sin \theta \, \text{d}\theta \, \text{d}\phi = 2\pi \Rightarrow p = \frac{1}{2\pi}

采样您的PDF将给您提供\theta = \arccos \xi_1 \phi = 2\pi \xi_2,其中\xi_1, \xi_2是0到1之间的独立随机实数。采样PDF并不总是那么容易,它本身就是另一个主题,但是要了解更多细节,您可以阅读这个优秀PBR摘录

但正如你所看到的,你可以做得更好:渲染方程中的余弦项从一开始就困扰着你,它告诉你,你应该倾向于这个词最大的方向。所以让我们选择一个pdf,这样

p = \alpha \cos \theta_i

如果您想知道\alpha的值,您必须记住,pdf的积分必须等于1。如果你算一下,这会给你p = \frac{\cos \theta_i}{\pi}

使用PBR中显示的方法对这个新的PDF进行采样,您将得到\theta = \arccos \sqrt{\xi_1}\phi = 2\pi \xi_2

现在,也只是现在,您可以注意到,呈现方程的余弦简化了PDF中的一个。然后你可以移除它们。

票数 3
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/12468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档