From de7bca7ef8b006acd0b5c8ca4f41093c77f5ff4a Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Wed, 28 Sep 2022 17:02:28 -0700 Subject: [PATCH] gltfio: fix occlusion strength Fixes #6106 --- RELEASE_NOTES.md | 1 + libs/gltfio/materials/base.mat.in | 4 ++-- libs/gltfio/materials/sheen.mat.in | 4 ++-- libs/gltfio/materials/transmission.mat.in | 4 ++-- libs/gltfio/materials/volume.mat.in | 4 ++-- libs/gltfio/src/JitShaderProvider.cpp | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) 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) {