我正在尝试在Python 3中实现环境光遮挡,并且看到反射球体下方的阴影,但它们似乎非常微弱。我不确定这是否意味着我错过了某些东西,还是只是对环境光遮挡产生多少阴影有错误的印象。

结果看起来像这样:



这被建模为球体(而不是三角形网格)。 4个淡黄色镜面球体悬停在一个非常大的球体上方,近似于一个平面,整个场景被一个非常大的白色发射球体围绕,该球体提供了周围的天空光。

对于每个像素样本选择高斯分布在像素中心附近的光线,并选择更多样本,直到方差足够低为止。光线从镜子球体反射到单个镜面反射方向,并在撞击地板时从可能方向的半球反射到任何方向。所有的光线最终都射向白色的天空球体,并且颜色是根据途中的损失确定的。

我是否忽略了一些重要步骤?

评论

您正在使用路径跟踪还是物理上精确的光线跟踪?如果是这样,则环境光遮挡已经是该算法的内置结果,因此无需专门建模。凭直觉,对我来说,阴影是微弱的似乎是正确的:您的球体是镜子,因此从球体附近的地面射出的散射光线将倾向于被反射并反射回天空盒,而不是像散射球那样反射回地面。

您知道srgb校正吗?如果没有,那可能是一个因素。 http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

我也和艾伦在一起,伽玛会引起各种对比度问题。但是均匀发射的球体会产生非常微弱的遮挡。您应该尝试在发射中使用衰减因子,以使垂直发射比放牧发射更强。另外,您的球体是反射性的,然后吸收。但是我想您的示踪剂没有考虑到这一点,否则我们会在您的视野下看到更多的能量。

您的天空可能投下了一点半影而不是阴影。将其缩小到较小的范围以进行检查。同样,这些球体间接照亮了背景。

我发现一张真实的照片证明您缺少某些遮挡imgur.com/a/qcxmK

#1 楼

从您的图像很难分辨出来,但看起来确实有些模糊。在调试这类事情时,尽可能地精简场景以消除图片中不必要的复杂性总是有用的。在您的情况下,请尝试仅创建一个在一个点上接触地面的扩散球体。将地面和球体的反照率设置为1。如果正确实施了环境光遮挡,则球体与地面的接触点的像素值应为0;反之亦然。离球体越远,像素值应越接近1(不大于1-确保在输出图像时不会夹住任何东西)。请确保伽玛校正您的图像。

描述中突出的一件事是


光线从[...]的任何方向反射碰到地板时可能的方向的半球


这本身很好,但是您需要确保将射线乘以Lambertian BRDF(即点(法线,射线)/ Pi )。更好的是直接从余弦半球采样,在这种情况下,所有因素都被抵消。这篇博文将所有重要信息集中在一个地方。

评论


$ \ begingroup $
反照率1不会产生永不收敛的图像吗? Afaik,反照率应始终小于1以使收敛发生。反射率1不会特别引起接触阴影,因为光线将被完美反射,直到它们到达诸如天空之类的光源为止。
$ \ endgroup $
– yuriks
15年8月12日,0:52

$ \ begingroup $
是的,在全局照明下不会有接触阴影。但是,问题是关于环境光遮挡,它仅执行一次反弹。此外,只要场景未关闭(即可见天空),即使使用1的反照率,如果使用全局照明,场景也会收敛。
$ \ endgroup $
– Benedikt Bitterli
15年8月12日在8:20



$ \ begingroup $
将球体放置在地面上并查看接触点的技巧很不错。请注意,它也可以调试(球形)灯光,但是方向相反!
$ \ endgroup $
–imallett
2015年10月11日,下午5:04

#2 楼

我将添加一些指南,以帮助读者理解Benedikt Bitterli的声明“确保对图像进行伽玛校正”。

伽玛校正图像并不意味着最后要使用电源滤波器。
它表示在所有计算过程中都在线性空间中进行工作,最后将输出编码为伽玛空间。

伽玛空间是该年龄段的所有显示设备都希望将RGB值呈现给它们的色彩空间。 br />
相对的线性空间是使用与物理发射成正比的值的事实。

因此,当艺术家编辑世界表面的反照率颜色的值时以及场景灯光的颜色,他是在伽玛空间中完成此操作的,因为没有任何版本的软件敢于修改用户输入的内容并仅保存原样。因此,艺术家正在查看存储在伽玛空间中的对他来说看起来不错的东西。

所以所有渲染引擎的第一步应该是首先将所有人工编辑的输入转换为线性空间。在您的情况下,这意味着所有球体的颜色和发射值。

然后,您可以使用float32组件(如果可能)在HDR中进行常规的射线追踪,brdf评估,蒙特卡洛采样,无论使用哪种方法。 (通常将128位SIMD作为r,g,b,a向量使用时效果很好。)最后,您可以通过启发式或手动根据选择的曝光值对HDR图像进行色调过滤。像clamp一样,此操作可能非常简单。然后直到那时,您才将最终图像编码到伽玛空间。

基础是:监视器将获取输入值x并应用公式x ^ 2.2在输出上创建物理辐射度像素。

因此,转换公式如下:

线性到伽马:x ^(1 / 2.2)
伽马到线性:x ^ 2.2

请注意,sRGB空间具有一个复杂的公式,一个if和一些偏移量。但是从远处看,曲线非常接近简单的伽玛。

要考虑的第二件事,您确定采样是公平的吗?
您可能在方向上进行了过多采样可以让更多的光线到达天空。检查采样的一致性。您说您使用的高斯对我来说就像您要要求偏见。只需使用经典的Lambert分布抽样:https://pathtracing.wordpress.com/
,您就可以减少获得与纯均匀球面等效的方差所必需的样本数量。并且还保存了余弦评估值,因为它嵌入了分布中。

最后,如果您的球体确实是反射镜,并且您的GI应该在实际起作用,那么它将在地面上积累反射能量,从而补偿您的遮挡阴影。在这种情况下,我什至希望看到更多的能量而不是变黑。

评论


$ \ begingroup $
有趣-谢谢。对于从球体到达地板的附加光线,我希望这比如果球体不存在则直接从天空直接到达天空的光线少,因为它们是凸的。也就是说,当光线均匀地来自天空时,我无法想象仅由凸面引起的焦散。即使在所有光都被反射(没有吸收)的极端情况下,我也希望没有阴影,而不是腐蚀性。
$ \ endgroup $
– trichoplax
2015年10月9日在2:47



$ \ begingroup $
我理解你的直觉。我想敢于对位于球体垂直切线以下的像素期望的能量进行分析计算,但是我的数学太慢了,我放弃了笑。实际上,凸面将仅通过一条路径反射到任何给定的奇异发射源点,因此焦散似乎是不合理的。
$ \ endgroup $
–v.oddou
15-10-16在1:19