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

Opengl 着色器中的Schlick几何衰减函数产生不正确的结果,opengl,glsl,shader,Opengl,Glsl,Shader,我已经在网上搜索了一段时间了,关于为什么我的物理着色器的几何衰减项,我不久前发布了一个问题,我似乎无法得出结果。我试图实现的功能可以在这里找到: 这是我当前对函数的迭代 vec3 Gsub(vec3 v) // Sub Function of G { float k = ((roughness + 1) * (roughness + 1)) / 8; float fdotv = dot(fNormal, v); return vec3((fdotv) / ((fdotv)

我已经在网上搜索了一段时间了,关于为什么我的物理着色器的几何衰减项,我不久前发布了一个问题,我似乎无法得出结果。我试图实现的功能可以在这里找到:

这是我当前对函数的迭代

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);
}
这是我的申请中上述内容的当前结果:

您可以清楚地看到左侧不应该出现的奇怪工件

我认为一个问题是我的正常状态。我相信这就是问题所在,因为每当我将相同的函数放入Disney BRDF编辑器时,我都会得到正确的结果。我相信这是法线,因为每当我在迪士尼的应用程序中查看法线时,我都会得到这个

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

我在两个应用程序中使用相同的模型,法线存储在模型文件中。有人能对此有什么见解吗

此外,我还想提到,这些是对我的法线所做的操作:

顶点着色器

mat3 normalMatrix = mat3(transpose(inverse(ModelView)));
inputNormal = normalize(normalMatrix * vNormal);
片段着色器

fNormal = normalize(inputNormal);

另外,请原谅我的急促代码,我已经试着让它工作了一段时间。

你能给一个链接到你试图实现的forumula吗?我寻找关键词,我所遇到的一切看起来都与您的代码大不相同。我想粗糙度是一个浮点数?您将它与整数常量混合,如果其中一个术语是浮点,这将起作用,尽管我个人认为,如果代码不依赖于这些类型的隐式类型转换,则代码更清晰。G函数不使用h参数。这是故意的吗?在正常情况下:你所拥有的应该是正确的。在着色器中为每个顶点计算逆矩阵效率很低,但我认为您现在关心的是正确性。我会把它写成transposeinversemat3ModelView。如果变换矩阵仅由旋转、平移和均匀缩放组成,只需将旋转矩阵应用于法线即可。只有在变换中有非均匀缩放或剪切变换的情况下,才需要整个逆处理。我试图实现这一点:粗糙度确实是一个浮点数,你说的没错,我现在只是想让它按预期工作。你找到解决方案了吗?