我已经写了一些基于标准BRDF的定制着色器,它使用了GGX分发项和Smith可见项。在平滑度标度的两端(在下面的图中是1和2),它看起来很棒。然而,随着平滑度设定为50%左右,事情开始变得有点丑陋(3)。金属度的增加使它更糟(4),强彩色镜面变得更糟,因为不同的颜色通道以不同的速率吹出(5)。

这似乎是由高光周围的反射项返回>1引起的,这可能是由于联合攻击将镜面乘以pi (而不是分割漫射)造成的,如下面的代码片段所示。
// Specular term
// HACK: theoretically we should divide diffuseTerm by Pi and not multiply specularTerm!
// BUT 1) that will make shader look significantly darker than Legacy ones
// and 2) on engine side "Non-important" lights have to be divided by Pi too in cases when they are injected into ambient SH
half roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
half V = SmithJointGGXVisibilityTerm (nl, nv, roughness);
half D = GGXTerm (nh, roughness);
half specularTerm = V*D * UNITY_PI; // Torrance-Sparrow model, Fresnel is applied laterHDR渲染非常有用,但不幸的是,我们的项目是在移动和使用LDR。我正在用一层透明的外套做一个汽车油漆着色器,所以在很多情况下,底漆很可能是半粗糙和半金属的,这似乎是这种BRDF最坏的情况。有人能提出一个方法来获得更理智的镜面亮点吗?或者是某种范围以外的镜面值的滚轮,还是完全不同的BRDF?
发布于 2017-07-21 21:36:59
使用基于物理的BRDF只有当您的整个管道是为物理单元构建的时候才有意义--如果没有某种形式的声调映射,极端范围的值就无法正确显示。您没有包含代码的这一部分,但是从外观上看,我会说您正在执行一个简单的箝位(),然后是线性->sRGB转换,这会导致糟糕的突出显示。
因为您还没有准备好在HDR中运行您的整个框架,所以您可以将一些简单的东西(比如乙状体操作符)应用到镜面组件上。与其他金砖四国相比,这看上去可能有点离谱,但应该会让这些亮点变得更加令人愉快。
https://computergraphics.stackexchange.com/questions/5396
复制相似问题