Properly remap roughness when reading from radiance map
This ensures that we consistently use perceptual roughness which matches the behaviour of most other PBR renderers like Blender, Ue4 and Godot 3
This commit is contained in:
parent
cdd99e9bec
commit
b2b89d7294
5 changed files with 10 additions and 19 deletions
|
|
@ -1084,12 +1084,13 @@ void fragment_shader(in SceneData scene_data) {
|
|||
#ifdef USE_RADIANCE_CUBEMAP_ARRAY
|
||||
|
||||
float lod, blend;
|
||||
blend = modf(roughness * MAX_ROUGHNESS_LOD, lod);
|
||||
|
||||
blend = modf(sqrt(roughness) * MAX_ROUGHNESS_LOD, lod);
|
||||
specular_light = texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod)).rgb;
|
||||
specular_light = mix(specular_light, texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod + 1)).rgb, blend);
|
||||
|
||||
#else
|
||||
specular_light = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ref_vec, roughness * MAX_ROUGHNESS_LOD).rgb;
|
||||
specular_light = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ref_vec, sqrt(roughness) * MAX_ROUGHNESS_LOD).rgb;
|
||||
|
||||
#endif //USE_RADIANCE_CUBEMAP_ARRAY
|
||||
specular_light *= scene_data.IBL_exposure_normalization;
|
||||
|
|
@ -1137,7 +1138,7 @@ void fragment_shader(in SceneData scene_data) {
|
|||
ref_vec = mix(ref_vec, n, clearcoat_roughness * clearcoat_roughness);
|
||||
float horizon = min(1.0 + dot(ref_vec, normal), 1.0);
|
||||
ref_vec = scene_data.radiance_inverse_xform * ref_vec;
|
||||
float roughness_lod = mix(0.001, 0.1, clearcoat_roughness) * MAX_ROUGHNESS_LOD;
|
||||
float roughness_lod = mix(0.001, 0.1, sqrt(clearcoat_roughness)) * MAX_ROUGHNESS_LOD;
|
||||
#ifdef USE_RADIANCE_CUBEMAP_ARRAY
|
||||
|
||||
float lod, blend;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue