我一直试图基于UE4中的真实阴影中的方程实现一个微面镜面反射BRDF,但在粗糙表面的高光部分,我得到了一些奇怪的环形工件:

以下是片段着色器的相关部分:
float D(float NoH, float roughness) {
float a = sqr(roughness);
float a2 = sqr(a);
float denom = PI * sqr(sqr(NoH) * (a2 - 1.0) + 1.0);
return a2 / denom;
}
float G1(float NoV, float k) {
float denom = NoV * (1.0 - k) + k;
return NoV / denom;
}
float G(float NoL, float NoV, float roughness) {
float k = sqr(roughness + 1) / 8.0;
return G1(NoL, k) * G1(NoV, k);
}
float F(float VoH, float ior) {
float f0 = sqr((1.0-ior)/(1.0+ior));
return f0 + (1.0 - f0) * exp2((-5.55473*VoH - 6.98316) * VoH);
}
vec3 brdf(in vec3 V, in vec3 L, in vec3 N, in Material mat) {
vec3 H = normalize(V+L);
float NoL = dot(N, L);
float NoV = dot(N, V);
float nom = D(dot(N, H), mat.roughness)
* F(dot(V, H), mat.ior)
* G(NoL, NoV, mat.roughness);
float denom = 4.0 * NoL * NoV;
return vec3(1) * nom / denom;
}
// ----------------------
void main() {
// ...
vec3 rd = normalize(frag_pos - camera_pos);
Material mat = materials[mat_index];
col = brdf(-rd, sun_dir, normal, mat);
// ...
}知道我做错什么了吗?
发布于 2019-07-19 21:39:31
结果是,环是从负除以负数的情况下发生的,所以添加nom = max(nom, 0.0);解决了这个问题。新的亮点被放大:

https://computergraphics.stackexchange.com/questions/9017
复制相似问题