顾名思义,我正在尝试实现沃尔特等人的“粗糙表面折射的Microfacet模型”的最后一幅图像。在OpenGL中

我“认为”(我必须把它放入引号中),我知道microfacet模型应该如何工作,希望只停留在实际的执行上。
所以我首先实现了正态分布,菲涅耳和几何函数的GGX公式。
一开始,但我还是不太确定如何把玻璃后面的物体的颜色加入公式中。我的第一个想法是在玻璃板周围创建一个立方体地图,然后使用出的方向向量(o_t和o_r)来采样cubemap。但是,我仍然不太确定如何将其纳入更大的范围。经过我的第一次思考,我只是将BTFD的结果与o_t向量的样本相乘,但是很明显,BTDF真的很大,所以整个板岩变成了白色(可能是bug?)。在将结果除以几次之后,一些应该出现的水洗版本出现了。
另外,我想我在某个地方读到,反射和透射应该分开处理,这取决于菲涅耳公式的结果。或者应该同时处理(可能是这样的: BRDF * sample_of_reflection + BTDF * sample_of_refraction)?
我发现另一件奇怪的事情是,给出的抽样公式:
在做了一些关于这个函数的实验之后,我注意到它基本上类似于高斯分布,指向正的z轴。但是,这种分布不应该给出分布在地表周围的样本吗?
我想知道我是否需要在我先前的声明中再加上一对引号.
因此,无论如何,这里是我的实现的伪代码,直到现在:
for(#samplecount)
{
//get a sample m
vec3 m = drawsample();
//calculate normal and incoming vector
vec3 i = normalize(viewPosition - fragmentPosition);
vec3 n = normalize(Normal);
// calculate outgoing vector
vec3 o_r = calculate_like_paper();
vec3 o_t = calculate_like_paper();
//sample cubemap
vec3 reflection = sampleCubemap();
vec3 refraction = sampleCubemap();
//calculate halfvectors
vec3 h_r = calculate_like_paper();
vec3 h_t = calculate_like_paper();
//calculate NDF, Fresnel and Geometry
float D = GGX_D(h_r);
float G = GGX_G(i, o_r, h_r);
float F = GGX_F(i, h_r);
//calculate BSDF, BRDF & BTDF
float BRDF = F * G * D / (4.0 * abs(dot(i, n)) * abs(dot(o_r, n)));
float BTDF = longFormula();
float BSDF = BRDF + BTDF
vec3 result += BRDF * reflection + BTDF * refraction //?
}
result /= #samplecount;如果你花点时间回答问题,我是StackExchange的新手,所以我可以用一些反馈来改进我问问题的方式,谢谢。
编辑:如果有人发现了这个问题,并且有类似的问题,Epic Games在这个话题上有一些很好的注释:https://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_史诗_备注_v2.pdf
发布于 2019-12-14 02:28:41
一开始,但我还是不太确定如何把玻璃后面的物体的颜色加入公式中。
正常情况下,这是用路径/射线追踪器编写的,这部分很容易。你对立方体地图的想法对于某些用例来说可能是可以的(例如。相对于周围物体的距离而言,表面相当粗糙)。然而,这不是一个普遍的解决办法。这可能需要GPU射线追踪。
经过我的第一次思考,我只是将BTFD的结果与o_t向量的样本相乘,但是很明显,BTDF真的很大,所以整个板岩变成了白色(可能是bug?)。
我是从记忆中写的,但我认为你需要除以PDF。这意味着你的权重将接近1,但不是完全1,因为抽样分布不包括阴影项。
另外,我想我在某个地方读到,反射和透射应该分开处理,这取决于菲涅耳公式的结果。或者应该同时处理(可能是这样的: BRDF * sample_of_reflection + BTDF * sample_of_refraction)?
经典的路径追踪器会根据菲涅耳系数随机选择反射或折射。这是有效的抽样。但是如果你可以很容易地从一个立方体地图中得到这两个,你也可以把它们和菲涅尔系数混合起来。
在做了一些关于这个函数的实验之后,我注意到它基本上类似于高斯分布,指向正的z轴。但是,这种分布不应该给出分布在地表周围的样本吗?
是的,你需要转换生成的方向。在方程(24)后的第5.2节中提到,\theta_m是m (微面法线)和n (表面法线)之间的夹角。由于这种定义microfacet模型的方法可以追溯到更早的文章中,所以它们并没有详细介绍。
简短的说法是,你用曲面法向z和其他两个垂直向量x和y建立一个正交基。在这里,什么分布是各向同性的,只要它们彼此垂直,就不重要。然后你用这个基础进行变换。
https://computergraphics.stackexchange.com/questions/9421
复制相似问题