diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 6c6b19f729..cd53726efe 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -8,6 +8,7 @@ A new header is inserted each time a *tag* is created. - engine: LiSPSM is now a user settable option - Java: Fix TransformManager.getChildren() - Metal: newer devices are no longer limited to 16 samplers per Material. +- gltfio: fix interpretation of occlusion strength ## v1.27.2 diff --git a/libs/gltfio/materials/base.mat.in b/libs/gltfio/materials/base.mat.in index bd0fb37b2f..da62ce9f8b 100644 --- a/libs/gltfio/materials/base.mat.in +++ b/libs/gltfio/materials/base.mat.in @@ -163,8 +163,8 @@ fragment { if (materialParams.aoIndex > -1) { highp float2 uv = uvs[materialParams.aoIndex]; uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy; - material.ambientOcclusion = texture(materialParams_occlusionMap, uv).r * - materialParams.aoStrength; + float occlusion = texture(materialParams_occlusionMap, uv).r; + material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0); } if (materialParams.emissiveIndex > -1) { highp float2 uv = uvs[materialParams.emissiveIndex]; diff --git a/libs/gltfio/materials/sheen.mat.in b/libs/gltfio/materials/sheen.mat.in index f579f12ad8..b8682ca34f 100644 --- a/libs/gltfio/materials/sheen.mat.in +++ b/libs/gltfio/materials/sheen.mat.in @@ -127,8 +127,8 @@ fragment { if (materialParams.aoIndex > -1) { highp float2 uv = uvs[materialParams.aoIndex]; uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy; - material.ambientOcclusion = texture(materialParams_occlusionMap, uv).r * - materialParams.aoStrength; + float occlusion = texture(materialParams_occlusionMap, uv).r; + material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0); } if (materialParams.emissiveIndex > -1) { highp float2 uv = uvs[materialParams.emissiveIndex]; diff --git a/libs/gltfio/materials/transmission.mat.in b/libs/gltfio/materials/transmission.mat.in index d0b518631a..3b1cd2283f 100644 --- a/libs/gltfio/materials/transmission.mat.in +++ b/libs/gltfio/materials/transmission.mat.in @@ -117,8 +117,8 @@ fragment { if (materialParams.aoIndex > -1) { highp float2 uv = uvs[materialParams.aoIndex]; uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy; - material.ambientOcclusion = texture(materialParams_occlusionMap, uv).r * - materialParams.aoStrength; + float occlusion = texture(materialParams_occlusionMap, uv).r; + material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0); } if (materialParams.emissiveIndex > -1) { highp float2 uv = uvs[materialParams.emissiveIndex]; diff --git a/libs/gltfio/materials/volume.mat.in b/libs/gltfio/materials/volume.mat.in index 432ea88d54..364da89627 100644 --- a/libs/gltfio/materials/volume.mat.in +++ b/libs/gltfio/materials/volume.mat.in @@ -133,8 +133,8 @@ fragment { if (materialParams.aoIndex > -1) { highp float2 uv = uvs[materialParams.aoIndex]; uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy; - material.ambientOcclusion = texture(materialParams_occlusionMap, uv).r * - materialParams.aoStrength; + float occlusion = texture(materialParams_occlusionMap, uv).r; + material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0); } if (materialParams.emissiveIndex > -1) { highp float2 uv = uvs[materialParams.emissiveIndex]; diff --git a/libs/gltfio/src/JitShaderProvider.cpp b/libs/gltfio/src/JitShaderProvider.cpp index 5fa1100304..5423643473 100644 --- a/libs/gltfio/src/JitShaderProvider.cpp +++ b/libs/gltfio/src/JitShaderProvider.cpp @@ -194,8 +194,8 @@ std::string shaderFromKey(const MaterialKey& config) { shader += "aoUV = (vec3(aoUV, 1.0) * materialParams.occlusionUvMatrix).xy;\n"; } shader += R"SHADER( - material.ambientOcclusion = texture(materialParams_occlusionMap, aoUV).r * - materialParams.aoStrength; + float occlusion = texture(materialParams_occlusionMap, aoUV).r; + material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0); )SHADER"; } if (config.hasEmissiveTexture) {