Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PBR GGX镜面反射去饱和色_Java_Opengl_Lwjgl_Shading_Pbr - Fatal编程技术网

Java PBR GGX镜面反射去饱和色

Java PBR GGX镜面反射去饱和色,java,opengl,lwjgl,shading,pbr,Java,Opengl,Lwjgl,Shading,Pbr,我正在尝试实现PBR渲染器。我的镜面反射高光具有去饱和的颜色(尤其是在掠射角度中),并逃逸了我的灯光体积边界球体。为什么会这样 我用于计算GGX镜面反射的函数: vec3 shadingSpecularGGX(vec3 N, vec3 V, vec3 L, float roughness, vec3 F0) { vec3 H = normalize(V + L); float dotLH = max(dot(L, H), 0.0); float dotNH = max(d

我正在尝试实现PBR渲染器。我的镜面反射高光具有去饱和的颜色(尤其是在掠射角度中),并逃逸了我的灯光体积边界球体。为什么会这样

我用于计算GGX镜面反射的函数:

vec3 shadingSpecularGGX(vec3 N, vec3 V, vec3 L, float roughness, vec3 F0)
{
    vec3 H = normalize(V + L);
    float dotLH = max(dot(L, H), 0.0);
    float dotNH = max(dot(N, H), 0.0);
    float dotNL = max(dot(N, L), 0.0);
    float dotNV = max(dot(N, V), 0.0);
    float alpha = roughness * roughness;
    // D (GGX normal distribution)
    float alphaSqr = alpha * alpha;
    float denom = dotNH * dotNH * (alphaSqr - 1.0) + 1.0;
    float D = alphaSqr / (denom * denom);
    // no pi because BRDF -> lighting
    // F (Fresnel term)
    float F_a = 1.0;
    float F_b = pow(1.0 - dotLH, 5); // manually?
    vec3 F = mix(vec3(F_b), vec3(F_a), F0);
    // G (remapped hotness, see Unreal Shading)
    float k = (alpha + 2 * roughness + 1) / 8.0;
    float G = dotNL / (mix(dotNL, 1, k) * mix(dotNV, 1, k));

    return D * F * G / 4.0;
}
然后在中,我将其与漫反射lambert项合并在一起:

float lambert = max(0.0, dot(lightDir, normal));
vec3 diffuse = albedo * (1 - metallic);
vec3 specular = mix(vec3(0.04), albedo, metallic) * light.color;

float distance = length(light.position - worldPos);
float attenuation = clamp(1.0 / (distance * distance * light.atten.quadratic + distance * light.atten.linear + light.atten.constant), 0.0, 1.0);

gl_FragColor.rgb = (diffuse * lambert * light.color * light.intensity) + shadingSpecularGGX(normal, viewDir, lightDir, roughness, specular) * light.intensity;

gl_FragColor.rgb *= attenuation;
gl_FragColor.a = 1.0;
从顶部查看时,镜面反射高光具有颜色,但随着相机靠近地面,颜色开始褪色

这是正确的行为吗?因为当看到湿沥青的照片时,反射的颜色似乎被保留了下来

通过将
F0
颜色更改为
light.color

vec3镜面反射=mix(light.color,反照率*light.color,金属)


但是我已经读到,F0值应该是非金属的0.04左右,我的镜面反射逃逸了我的边界球。

有没有理由把镜面反射项与光强度相乘,而不是与光颜色相乘?我在这行中乘以镜面反射:
vec3镜面反射=mix(vec3(0.04),反照率,金属)*light color。对于金属材料,反照率为金属色。intesity只是指定灯光强度的浮点值。然而,在这些情况下,它是1.0,所以它不应该改变anything@BDL与光线的颜色相乘。亮度解决了我的问题。如果你想写答案,我会接受的。