我使用Schlick近似来计算菲涅耳效应的数值,我发现了这里。
当我试图找到公式的角情形时,当法向和观察方向的夹角为90°和0,02为0°时,得到1的值(我使用IOR 1和1.33)。这意味着,例如,当观察一个球体时,它的边缘会反射几乎所有的光,而它的中心只反射2%的光。
但当我试图在BRDF的microfacet模型中使用它时,他对我来说是没有意义的。

这意味着,当直接从上面看到表面反射率将只有2%,这是不切实际的低。98%的能量会被表面吸收。因此,在3次反弹后,光线的传输将不到光的0,0008%。这将使图像变暗,我将不得不大量地增加它发出的光。
我是不是在想这件事?
我的第二个想法是,它意味着多少光作为一个完美的反射被直接反射,而不被分散到其他方向上。其余的用于漫反射/光滑反射。但我在任何地方都找不到证据。
或者,在处理非透明材料时,我不需要简单地使用菲涅耳。
这是我现在的密码。
//Position of intersection is world space
float3 hitpoint = ray.origin + ray.direction * ray.distance;
//Direction towards camera
float3 wo = -ray.direction;
//Geometry normal
float3 N = ray.worldNormal;
//Microfacet normal
float3 H = SampleMicrofacetNormal(roughness, &N, &ray);
//New direction of ray
float3 wi;
// Add light emitted from surface
ray.color += ray.mask * emission;
float F = Fresnel(&H, &wi);
float r1 = new_random(&ray.seed1);
if (r1 <= F) {
//Specular
//Reflected direction
float3 wi = reflect(&H, &wo);
float D = D_ggx(roughness, &N, &H);
float G = G_CookTorrance(roughness, &N, &H, &wo, &wi);
float weight = fabs(dot(wo, H)) / fabs(dot(N, wo) * dot(N, H));
//Not using F because it is already taken into a count by
//the probability of this IF/ELSE statement
float reflectance = G * weight;
ray.mask *= reflectance;
//Check - new direction cannot point towards surface
if (dot(wi, N) < 0) ray.mask = (float3)(0.0, 0.0, 0.0);
}
else {
//Diffuse
//Ray change color because light to through the material
ray.mask *= color;
//New random direction of diffuse ray
wi = SampleDiffuseCosineWeighted(&N, &ray);
//Importance sampling weight
ray.mask *= dot(wi, N);
}
//Set new direction and position for next tracing
ray.direction = wi;
ray.origin = hitpoint + N * EPSILON;发布于 2020-04-23 20:49:20
如果你只执行菲涅耳,你就会发现,你在最初的问题中的想法主要是对介电材料正确的。

然而,不要事先计算菲涅耳,然后随机决定是评估你的镜面成分还是你的漫射成分。作为BRDF的一部分,你必须在评估BRDF的同时积累菲涅耳项,最后才能为漫射部分做1-Facc。如果你是在一个纯粹的随机路径,那么你直接这样做,同时评估你的微面。这被称为“粗糙菲涅尔”,这是所有现代渲染引擎使用的模型。
为了获得更好的菲涅耳公式,得到了完整的菲涅耳公式(金属复菲涅耳公式)。对于更友好的Fresnel,您可以实现“菲涅耳按颜色”(现在我不记得确切的名称了,稍后我会添加它),所以输入数字,您可以输入F0和F1的颜色。这就是最新的Renderman的做法。最后,在菲涅耳和ComplexFresnel之间添加一个“金属度”参数。
例如,一些用于检查的代码(BRDF示例fnc):

发布于 2020-04-22 21:37:51
我将根据我对菲涅耳模型的经验来回答。由于基尔霍夫热辐射定律,在不透明材料中,发射率加反射率加吸收系数在热平衡的各个方向等于1。如果您使用的BRDF模型是基于物理的,那么它应该保持节能。这意味着,对于给定的视角,整个半球的方程积分应该等于1。可能在正常值附近的反射率值很低,但这意味着它的大部分贡献在其他地方。例如,对于接近正常的观看方向,你可以有一个非常低的镜面反射率,但一个更高的漫射成分。这可能是你的模型的情况。
发布于 2020-04-23 00:41:17
模型的大更新和解释
当我清理我的浏览器并关闭大约100个标签时,我发现了这个很棒的网站 (它在那里3天了,所以我已经找到了一个答案……)终于让我明白了一切。
问题根本不在菲涅尔。事实上,在大多数时间里,您使用的IOR并不重要。菲涅尔说有多少光作为镜面砖的一部分被反射。这里重要的是“镜面”这个词。这意味着当光线击中表面时,光线就会反射出来,而不会穿过。其余的光线没有被折射,做这些事情之一:被吸收或折射(就像在玻璃中),或者分散在周围,然后作为漫射光返回到表面。扩散成分在我的路径追踪器中丢失了。我以为镜面BRDF会把漫射光带入计数,但它没有。
在这里,我将总结如何使用微面反射BRDF和漫反射BRDF作为递归路径跟踪器,在这里,一次只能容纳一个像素的一条射线。
使用BRDF的两个组件是很重要的。不幸的是,当您搜索microfacet时,他们通常希望您知道它只是用于镜面部分。
我希望这对一些初学者有帮助,因为对我来说这是一场很大的斗争。
。
好的,经过一些搜索,我可能找到了一个原因,为什么在微面模型中使用菲涅耳是完全可以的。
我的问题是,当从0°的角度看时,反射率很低,正如我说的,我用IOR 1作为空气,用1.33表示物体。这是个大错误。
当您创建IOR = 1.33的Schlick近似图时,下限为0.02。但这只适用于IOR为1.33的材料,如玻璃。当我看这个页面,它显示不同材料的IOR,你找到一个3D艺术家的部分,你可以看到金属的IOR是3.17。把它插入方程中,你的下限是0.27。那是十倍多!
更有趣的是,当你向下滚动时,你可以找到“反射计算”。这输出反射率的函数(使用非偏振光),我需要.这是相当奇怪的,Schlick近似结果几乎完全相同的功能,在网站上的玻璃,但当我使用IOR = 3.17的铁,它是很遥远的。网站的最小反射率应该是0.7688。
这意味着,我唯一要做的就是为F分量找到一个更精确的函数(停止使用Schick近似),并使用材料的实IOR。简单地说,“墙大部分时间都不是水”
如果我错了请告诉我..。再来一次。
我找到了这个页面。它解释了你需要知道的关于菲涅耳效应的一切。最重要的是,它同时关心电介质和金属。
以下是一个简化的版本:
每次使用Schlick近似,但不要计算F0 = (n1-n2)/(n1+n2)^2,而是使用自己的值。如果你想要精确的反射,那么看看网站,对于F0,选择0°的反射率。这是一种基线。这对介电(IOR高达1.5)并不重要,因为基态Schlick近似是有效的,所以请自由使用上面的方程。
小心金属材料。菲涅耳效应取决于光的波长,因此R,G的值不同。
https://computergraphics.stackexchange.com/questions/9749
复制相似问题