着色器中的Schlick几何衰减函数会产生不正确的结果

时间:2014-05-24 01:04:08

标签: opengl glsl shader

我一直在网上搜索一段时间为什么我的几何衰减项为我的物理着色器(我不久前发布了一个问题),我似乎无法得出结果。我正在尝试实现的功能可以在这里找到:http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf

这是我当前对函数的迭代。

vec3 Gsub(vec3 v) // Sub Function of G
{
    float k = ((roughness + 1) * (roughness + 1)) / 8;
    float fdotv = dot(fNormal, v);
    return vec3((fdotv) / ((fdotv) * (1.0 - k) + k));
}
vec3 G(vec3 l, vec3 v, vec3 h) // Geometric Attenuation Term - Schlick Modified (k = a/2)
{
    return Gsub(l) * Gsub(v);
}

这是我申请中的上述结果: enter image description here

您可以清楚地看到左侧的奇怪文物,这些文物不应该存在。

我认为其中一个问题是我的常规。我相信这是问题所在,因为每当我将相同的功能放入迪士尼BRDF编辑器(http://www.disneyanimation.com/technology/brdf.html)时,我都会得到正确的结果。我相信这是正常的,因为每当我查看迪士尼应用程序中的法线时,我都会得到这个。

Disney BRDF Result

这些法线与我的法线不同,这应该是正确的:

In my application

我在两个应用程序中使用相同的模型,并且法线存储在模型文件中。任何人都可以对此有所了解吗?

此外,我想提一下,这些是我的法线上的操作:

顶点着色器

mat3 normalMatrix = mat3(transpose(inverse(ModelView)));
inputNormal = normalize(normalMatrix * vNormal);

片段着色器

fNormal = normalize(inputNormal);

P.S。请原谅我的rushy-code,我一直想让它工作一段时间。

0 个答案:

没有答案