为什么在镜面反射明暗处理中使用H(阴影)代替R(phong)?


22

我在任何地方都找不到这样做的充分理由。phong中使用的反射向量在物理学上具有简单的基础。但是,在blinn中使用的半向量似乎没有合理的基础,并且不能构成适当的反映。但是,它已用于所有所谓的“基于物理的”阴影功能中。如果有良好的身体基础,我想知道。

我找到的原因有几个:

它的速度更快 -对此的信息参差不齐,但是即使如此,这也仍然是一个很好的理由……在1998年。

我所知,它处理角度大于90度的效果更好 -唯一的原因是,不当使用phong术语。反射和视图的点积给出介于-1和+1之间的角度。通常将此角度钳制为0到1,这是90度问题的直接原因。重新对角度进行归一化,而不是对其进行夹紧,即可获得完整的180度覆盖范围。我拒绝相信简单的x * 0.5 + 0.5运算已经使图形世界望尘莫及了40年。

它可以更好地处理边缘 -边缘“问题”在blinn解决方案中也存在,只是程度较小。主要原因是在终结器处对区域光照的模拟不正确,这对于任何“基于物理的”着色器来说都是必不可少的。但是,即使在较简单的情况下,S型函数也可以正确地逼近软终止线。乘以兰伯特项是不正确的,因为它会不适当地衰减镜面项,这可能会抵消菲涅耳项并导致进一步的误差。

它在边缘有很长的反射 -在我看来,尽管各向异性反射可能是现实的,但blinn并不是实现它们的正确方法,因为它们仅出现在边缘。H项中的错误恰好看起来是现实的,这只是一个快乐的巧合。

这些原因都不能令人满意,我想理清这种疯狂。

我想澄清的是,我并不是在专门讨论blinn和phong ,而是在讨论向量分量H和R,它们被用作这些着色器以及其他着色器的基础。

Answers:


24

对于完美反射的表面,Phong模型很有意义。但是,用于近似粗糙表面的Phong模型的(RV)^ n中的n来自哪里?除了将点积的结果似乎凭经验给出适当的结果外,您必须将点积的结果提高到幂的理论在哪里?

对于布林模型,存在基于物理的微面理论来支持方程中的所有组件,并且还有经验证据表明该模型更紧密地逼近现实世界的表面(尽管并不完美)。Blinn模型中的半向量用作正态分布函数(NDF)的输入,正态分布函数(NDF)是近似的微面如何围绕表面法线作为表面粗糙度的函数分布。即,当H向量指向法线方向时,该值最高,因为大多数微面都指向该方向,并且当法线与H向量之间的角度增大时,概率相应降低。

Blinn模型无论如何都不是完美的,例如,它没有考虑微面模型的几何条件(即,对微面的遮蔽和掩盖,其重要性在掠射角度上会增加)。


我并不是说phong的具体实现确实没有物理基础。但是我看不到微面理论如何支持H优于R作为反射矢量的基础。根据经验,没有阴影模型得到支持,按照“ 2005年BRDF的实验验证”,每个人都无法复制真实的材料。在我看来,微面是通过点积R·V在phong中建模的,它可以用作通过重新映射功能或渐变获得更物理正确的突出显示的基础。幂函数只是最简单,最不正确的重映射。
BmB

2
@BmB不,微面不是“ phong建模的”,而是使用由NDF定义的微面的概率分布,而NDF是通过H向量“采样”的。NDF通常相对于法线(各向同性/各向异性)对称,因此使用H向量是有意义的。我说,有经验证据表明,布林模型 紧密地接近比海防真实世界的材料。
JarkkoL 2014年

任何不沿着反射矢量的反射都不是完美的镜面反射。点积会产生不理想角度的反射率值。必需地,这些必须由微面产生。因此,点积可以对微面建模。一个简单的点产生线性分布。但分布可以有R一样好H.这说明一无所知h的R上的效力的任何函数来建模
BMB

1
@BmB我建议您阅读有关微面理论的文章,​​尤其是有关NDF部分的文章,以了解该概念。这将帮助您获得问题的答案。
JarkkoL 2014年

1
您应该对微面和NDF提出一个新的问题,因为显然您对这些概念不了解很多,并且注释也不是解释它们的正确位置。
JarkkoL 2014年

6

实际上,我认为您自己列出了Blinn超过Phong的默认原因。

实际上,您列出的每个原因都是Blinn被证明优于Phong的地方。

总体而言,所有这些导致Blinn比Phong更好的默认值。

布林完美吗?它比Phong好吗?

没有。

但这一个合理的默认值。在您编写的任何渲染器/着色器中,可以随意用Phong代替Blinn。


同意,就是这样。两种模式都不完美。当时,Blinn的近似值首先是性能优化,因为计算半角更便宜。事实证明,大多数时候它看起来也更好。
戴蒙2014年

-2

我发现了使用H向量的原因。不幸的是,它不是大多数阴影模型中使用的方式,因此可以得出结论是不正确的。

对于基于物理的阴影,反射光必须服从菲涅耳方程。(大多数“基于物理的”着色器没有)微面还必须遵守菲涅耳方程,菲涅耳方程式依赖于光的入射角以及界面的折射率才能产生正确的结果。

根据反射定律,入射角必须与沿着表面法线的反射角成镜像关系。为了使一束光线射到相机上(我们知道确实如此),它一定已经被光线反射了,我们才知道方向。因此,表面法线必须通过推导得出这两个方向的镜像轴。这给了我们在它们之间的半矢量H。通过归一化两者的总和来计算。

现在,通过计算光方向L和半矢量H之间的角度,我们获得了微面镜面反射的入射角,并可以使用菲涅耳项正确衰减它。

请注意,该微平面的视图方向等于R,H不是反射项。布林,库克,托兰斯和麻雀可以吸食它。Phong和Fresnel是正确的。


菲涅耳项是微面BRDF方程的一部分,单个微面没有考虑到这一点,因为它们被建模为完美的反射器。同样,您不计算L和H向量之间的角度,而是计算N和H向量之间的角度。这应该给您提示为什么使用H。您需要对该主题有更多的了解,才能得出谁是对的或“更对的”;)
JarkkoL 2014年

材料的微面具有与材料相同的特性。因此,不完美的反射镜的微面本身不能成为完美的反射镜。您的逻辑不健全,无济于事。N点H没有物理意义。
BmB

4
不,那不是微面模型的工作原理。我的逻辑是完全合理的,因为任何了解微面模型基础知识的人都可以证实。每个微刻面都是完美的反射器(即光学平面),材料的不完美反射来自NDF定义的微刻面法线的变化。您坚持不懈地
拒绝

您没有给出任何建议,您所做的只是坚持断言您是对的,没有任何东西可以支持它,并且可以侮辱他人。H是微面的法线,不是反射。可以使用法线计算反射率。基础物理学与您不同意。
BmB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.