首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微面BRDF伪影

微面BRDF伪影
EN

Computer Graphics用户
提问于 2019-07-19 15:08:48
回答 1查看 111关注 0票数 0

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

以下是片段着色器的相关部分:

代码语言:javascript
复制
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);

    // ...
}

知道我做错什么了吗?

EN

回答 1

Computer Graphics用户

回答已采纳

发布于 2019-07-19 21:39:31

结果是,环是从负除以负数的情况下发生的,所以添加nom = max(nom, 0.0);解决了这个问题。新的亮点被放大:

票数 1
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/9017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档