我正在创建一个路径追踪器,在计算光的强度时得到了一些奇怪的结果。
我使用的是一个由这个图表启发的渲染方程:

编辑1:我包括了伪代码。余弦是点积。在布恩之后,有一些东西我没有包括在内,因为它们对方程没有贡献。
<!-- 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倍的样本):

发布于 2022-01-31 17:05:46
当我使用余弦时,一切都变得非常黑暗,我的球体边缘几乎是黑色的。这是合理的,因为我几乎乘以cos(PI/2) = 0。我读到它应该用一些东西来抵消,所以我删除了它,这是有帮助的。但是它用什么来抵消呢?
这个余弦有几何意义,保留它,或者如果你去掉它,一定要有数学上的理由去做。掠角对地表的辐射分布较小,在90°时,接收到的辐射为零。
我使用Lambertian漫反射BRDF,这意味着方程的"Fr“部分应该是”反照率/ PI“。我也在做均匀的半球取样,这给了我一个PDF 1/ PI。现在,当我计算BRDF / PDF时,我得到了"2 *反照率“。这似乎不对。这意味着,我越多地反弹,光的影响就越大,这是无稽之谈。第三次反弹的光线比第一次反弹时的光线要暗一些。我在哪里犯了个错误?
概率密度函数p,按其定义,在整个定义集上必须有一个1的积分,因此在半球上。如果你算算的话,你会得到:
采样您的PDF将给您提供\theta = \arccos \xi_1 ,\phi = 2\pi \xi_2,其中\xi_1, \xi_2是0到1之间的独立随机实数。采样PDF并不总是那么容易,它本身就是另一个主题,但是要了解更多细节,您可以阅读这个优秀PBR摘录。
但正如你所看到的,你可以做得更好:渲染方程中的余弦项从一开始就困扰着你,它告诉你,你应该倾向于这个词最大的方向。所以让我们选择一个pdf,这样
如果您想知道\alpha的值,您必须记住,pdf的积分必须等于1。如果你算一下,这会给你p = \frac{\cos \theta_i}{\pi}。
使用PBR中显示的方法对这个新的PDF进行采样,您将得到\theta = \arccos \sqrt{\xi_1},\phi = 2\pi \xi_2。
现在,也只是现在,您可以注意到,呈现方程的余弦简化了PDF中的一个。然后你可以移除它们。
https://computergraphics.stackexchange.com/questions/12468
复制相似问题