为了进行测试,我使用镜面平面上的球形光源(朗伯发射)。这是使用指数为
30000
的节能Phong的参考图像:注意,没有能量损失。我现在想为Blinn-Phong实现相同的目标。
这是我的尝试(指数相同,但在Blinn-Phong BRDF上):
如您所见,能量损失了很大一部分。我使用的归一化术语来自此处,为$ \ frac {n + 1} {2 \ pi} $。问题是这是一个标准化术语,而不是保守术语。
我相信这是预期的结果。在图形中,通常使BRDF反射的能量少于输入的能量,而不是精确的能量,因为这通常不那么困难。1、2
我的问题:
是否有一个版本可以完全节省所有能量?
不,有人可以至少确认这是预期的吗?
1这可以从微观方面的阴影/掩盖论证中得到辩驳。不幸的是,它忽略了多重散射。正确的答案介于两者之间。
2实际上,我必须自己导出Phong保护术语。
#1 楼
首先,这可能不是测试节能的最佳方法,因为并非所有入射倾斜都在图像中可见。大多数环境也是黑色的,因此像Lambert这样的不太“尖锐”的BRDF会变得很暗,而无法分辨它是否节能。更常用的是所谓的“熔炉测试”,即您将一个球体放置到白色环境图中。当使用感兴趣的BRDF渲染此球体时,如果BRDF是节能的,则它应该完美地融合到环境中(确保没有颜色通道被裁剪)。因为它是一个球体,所以您将能够在所有入射角度看到BRDF。此外,球体是凸形的,因此场景中没有其他任何物体,不会遮挡任何反射光线,并且图像中球体的每个像素都将以不同的倾斜度在BRDF上不可分割。
如果进行了此测试,您还会注意到Phong BRDF很可能不节能。 $ \ frac {n + 1} {2 \ pi} $(或$ \ frac {n + 2} {2 \ pi} $,取决于您要求的对象)的常用归一化项仅在正常发生时有效。在其他倾斜度下,特别是在掠射角度下,最多有一半的反射光线会降落在表面以下,并且通常会被终止(因为通过反射表面进行透射是没有意义的。)钳位在半球下方的部分很难计算。吉姆·阿沃(Jim Arvo)使用双轴矩得出了整数指数的闭式解,总结于《全球照明简编》第31a)和31b)段(第17/18页)。这些公式对于在渲染器中使用不是很实用,我不建议实现它们。
应该清楚的是,如果像Phong这样的简单模型已经很难标准化,那么Blinn-Phong就更加困难。首先,您提到的$ \ frac {n + 1} {2 \ pi} $归一化术语只有在将Blinn-Phong用作完整微面BRDF(例如Torrance-Sparrow或Walter)内的微面分布时才是正确的。如果直接使用Blinn-Phong BRDF,则更正确的归一化项是$ \ frac {(n + 2)(n + 4)} {(8 \ pi 2 ^ {-n / 2} + n)} $ ,由Fabian Giesen撰写的这篇简短文章(第二页)中列出,并在您提及的页面上列出。但是,此归一化术语再次仅在法向入射时正确,而在其他倾斜度时则不正确。据我所知,不存在确切的归一化术语。
评论
$ \ begingroup $
这确实是一个更好的测试。实际上,我实施的Phong归一化确实基于全球照明纲要31a。它可以算作一维表,您可以将其预计算为每个BRDF所需的分辨率。另一个标准化项产生的结果要弱得多,这在这种掠过的反射情况下可能是可以预期的。我也在尝试自己解决问题-类似的一维表格方法应该可行。
$ \ endgroup $
–imallett
2015年10月17日在16:53