我试图将"Belcour,L,& Barla,P. (2017)“论文中描述的薄膜干涉效应(https://hal.archives-ouvertes.fr/hal-01518344/document)整合到我的材料模型中,该模型基于google/film的材料模型(https://google.github.io/filament/Filament.md.html),是对微面理论的一种实际扩展。
然而,我很难理解将它们加在一起的方法。假设我在给一个像素阴影,直接照明是这样的:
vec3 Fr = specularLobe(); // D * F * V
vec3 Fd = diffuseLobe(); // 1 / PI * diffuseColor
return (Fd + Fr) * light.color * light.attenuation * NoL;在另一边,间接照明是这样的.
vec3 Fd = diffuseIrradiance() * diffuseColor;
vec3 Fr = specularIrradiance() * DFG();
return (Fd + Fr);现在,如果我想在基础材料的顶部加上薄膜/彩虹层,那么对于所有的照明,它以什么方式考虑到底层呢?
我一直在研究UE4 (https://polycount.com/discussion/comment/2604578#Comment_2604578)中的这个实现,但是他们似乎把BRDF计算的结果直接输入到材料的“基本颜色”中,我真的不认为这是我想要的,如果我错了,请纠正我……

在统一(https://github.com/Xerxes1138/Iridescence/blob/master/Iridescence.shader)中的另一个实现中,它们似乎分别在IBL和直接照明中考虑到了彩虹,但据我所知,层基并没有被考虑太多。
最后,在文件本身中,作了以下说明:
我们的扩展包括用一个更复杂的项代替经典的菲涅耳反射项F,R代表薄膜层内的所有相互反射,包括建设性的和破坏性的干涉效应。
从这一点我理解,简单地用Airy反射函数代替菲涅耳反射,就可以做到这一点,但是,我不确定哪一种方法是尽可能正确的物理上正确的。
(论文中的原始支持代码可以从:https://hal.inria.fr/hal-01518344v2/file/supplemental-code%20%282%29.zip获得)
谢谢你的帮助!
发布于 2019-02-01 09:42:44
不幸的是,彩虹模型并不适用于漫射项。Pascal和我只为microfacet模型制作了它(这是镜面术语)。
了解如何将其包含到游戏引擎的一种方法可能是查看联合的HDRP实现。
在Lit.hlsl中,看看如何将彩虹菲涅耳合并到镜面+漫反射反射区中:
PreLightData GetPreLightData(float3 V, PositionInputs posInput, inout BSDFData bsdfData) {
[...]
if (bsdfData.iridescenceMask > 0.0)
{
bsdfData.fresnel0 = lerp(bsdfData.fresnel0, EvalIridescence(topIor, viewAngle, bsdfData.iridescenceThickness, bsdfData.fresnel0), bsdfData.iridescenceMask);
}
}请参阅EvalIridescence在BSDF.hlsl中的实现:
他们所做的是将标准菲涅耳项与基于彩虹掩模值的彩虹项相结合。
我希望这能帮上忙。
https://computergraphics.stackexchange.com/questions/8532
复制相似问题