From d64ae0ac77a9ec3fb4fa27d2dfc9a7c7a86310f3 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 5 Apr 2018 12:56:25 -0400 Subject: [PATCH 1/7] Convert to and from sRGB, so PBR calc happens in linear space. Also, found a place where "baseColor" was used in place of diffuse. --- .../processPbrMetallicRoughness.js | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js index 0734761af1aa..74ed4ae80087 100644 --- a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js +++ b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js @@ -389,9 +389,9 @@ define([ // Fragment shader lighting fragmentShader += 'const float M_PI = 3.141592653589793;\n'; - fragmentShader += 'vec3 lambertianDiffuse(vec3 baseColor) \n' + + fragmentShader += 'vec3 lambertianDiffuse(vec3 diffuseColor) \n' + '{\n' + - ' return baseColor / M_PI;\n' + + ' return diffuseColor / M_PI;\n' + '}\n\n'; fragmentShader += 'vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH) \n' + @@ -422,6 +422,17 @@ define([ ' return roughnessSquared / (M_PI * f * f);\n' + '}\n\n'; + fragmentShader += 'vec4 SRGBtoLINEAR(vec4 srgbIn) \n' + + '{\n' + + ' vec3 linearOut = pow(srgbIn.rgb, vec3(2.2));\n' + + ' return vec4(linearOut, srgbIn.a);\n' + + '}\n\n'; + + fragmentShader += 'vec3 LINEARtoSRGB(vec3 linearIn) \n' + + '{\n' + + ' return pow(linearIn, vec3(1.0/2.2));\n' + + '}\n\n'; + fragmentShader += 'void main(void) \n{\n'; // Add normal mapping to fragment shader @@ -470,7 +481,7 @@ define([ // Add base color to fragment shader if (defined(parameterValues.baseColorTexture)) { - fragmentShader += ' vec4 baseColorWithAlpha = texture2D(u_baseColorTexture, ' + v_texcoord + ');\n'; + fragmentShader += ' vec4 baseColorWithAlpha = SRGBtoLINEAR(texture2D(u_baseColorTexture, ' + v_texcoord + '));\n'; if (defined(parameterValues.baseColorFactor)) { fragmentShader += ' baseColorWithAlpha *= u_baseColorFactor;\n'; } @@ -552,7 +563,7 @@ define([ fragmentShader += ' float G = smithVisibilityGGX(alpha, NdotL, NdotV);\n'; fragmentShader += ' float D = GGX(alpha, NdotH);\n'; - fragmentShader += ' vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(baseColor);\n'; + fragmentShader += ' vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor);\n'; fragmentShader += ' vec3 specularContribution = F * G * D / (4.0 * NdotL * NdotV);\n'; fragmentShader += ' vec3 color = NdotL * lightColor * (diffuseContribution + specularContribution);\n'; @@ -589,7 +600,7 @@ define([ fragmentShader += ' color *= texture2D(u_occlusionTexture, ' + v_texcoord + ').r;\n'; } if (defined(parameterValues.emissiveTexture)) { - fragmentShader += ' vec3 emissive = texture2D(u_emissiveTexture, ' + v_texcoord + ').rgb;\n'; + fragmentShader += ' vec3 emissive = SRGBtoLINEAR(texture2D(u_emissiveTexture, ' + v_texcoord + ')).rgb;\n'; if (defined(parameterValues.emissiveFactor)) { fragmentShader += ' emissive *= u_emissiveFactor;\n'; } @@ -602,6 +613,7 @@ define([ } // Final color + fragmentShader += ' color = LINEARtoSRGB(color);\n'; var alphaMode = material.alphaMode; if (defined(alphaMode)) { if (alphaMode === 'MASK') { From e1746bad7e0bd229509d368fcfa5aba9823aa1c9 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 5 Apr 2018 14:39:47 -0400 Subject: [PATCH 2/7] Tweak procedural IBL gradients and Sun light strength. --- .../processPbrMetallicRoughness.js | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js index 74ed4ae80087..2a6c89615811 100644 --- a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js +++ b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js @@ -524,10 +524,12 @@ define([ fragmentShader += ' vec3 v = -normalize(v_positionEC);\n'; // Generate fragment shader's lighting block - fragmentShader += ' vec3 lightColor = vec3(1.0, 1.0, 1.0);\n'; if (optimizeForCesium) { + // The Sun is brighter than your average light source, and has a yellowish tint balanced by the Earth's ambient blue. + fragmentShader += ' vec3 lightColor = vec3(1.5, 1.4, 1.2);\n'; fragmentShader += ' vec3 l = normalize(czm_sunDirectionEC);\n'; } else { + fragmentShader += ' vec3 lightColor = vec3(1.0, 1.0, 1.0);\n'; fragmentShader += ' vec3 l = vec3(0.0, 0.0, 1.0);\n'; } fragmentShader += ' vec3 h = normalize(v + l);\n'; @@ -574,26 +576,30 @@ define([ fragmentShader += ' float atmosphereHeight = 0.05;\n'; fragmentShader += ' float blendRegionSize = 0.1 * ((1.0 - inverseRoughness) * 8.0 + 1.1 - horizonDotNadir);\n'; - fragmentShader += ' float farAboveHorizon = clamp(horizonDotNadir - blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999);\n'; + fragmentShader += ' float blendRegionOffset = roughness * -1.5;\n'; + fragmentShader += ' float farAboveHorizon = clamp(horizonDotNadir - blendRegionSize * 0.5 + blendRegionOffset, 1.0e-10 - blendRegionSize, 0.99999);\n'; fragmentShader += ' float aroundHorizon = clamp(horizonDotNadir + blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999);\n'; fragmentShader += ' float farBelowHorizon = clamp(horizonDotNadir + blendRegionSize * 1.5, 1.0e-10 - blendRegionSize, 0.99999);\n'; fragmentShader += ' float smoothstepHeight = smoothstep(0.0, atmosphereHeight, horizonDotNadir);\n'; - fragmentShader += ' float lightScale = smoothstepHeight * 1.5 + 1.0;\n'; - fragmentShader += ' vec3 diffuseIrradiance = mix(vec3(0.5), vec3(0.05), smoothstepHeight);\n'; - fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.1, 0.2, 0.4), vec3(0.2, 0.5, 0.7), smoothstepHeight);\n'; + fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.2, 0.3, 0.45), vec3(0.4, 0.7, 0.9), smoothstepHeight);\n'; fragmentShader += ' vec3 nadirColor = belowHorizonColor * 0.5;\n'; - fragmentShader += ' vec3 aboveHorizonColor = vec3(0.8, 0.9, 0.95);\n'; - fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.09, 0.13, 0.24), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.5);\n'; + fragmentShader += ' vec3 aboveHorizonColor = vec3(0.9, 0.95, 1.0);\n'; + fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.5);\n'; fragmentShader += ' vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, smoothstepHeight);\n'; - fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * inverseRoughness);\n'; + fragmentShader += ' float diffuseIrradianceFromEarth = (1.0 - horizonDotNadir) * (reflectionDotNadir * 0.25 + 0.5) * smoothstepHeight;\n'; + fragmentShader += ' float diffuseIrradianceFromSky = (1.0 - smoothstepHeight) * (1.0 - (reflectionDotNadir * 0.25 + 0.25));\n'; + fragmentShader += ' vec3 diffuseIrradiance = blueSkyColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0);\n'; + + fragmentShader += ' float fullBlur = 1.0 - roughness * (horizonDotNadir * 0.25 + 0.5);\n'; + fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * fullBlur);\n'; fragmentShader += ' specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, reflectionDotNadir) * inverseRoughness);\n'; fragmentShader += ' specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n'; fragmentShader += ' vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, 1.0 - roughness)).rg;\n'; fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * (specularColor * brdfLut.x + brdfLut.y));\n'; - fragmentShader += ' color = color * lightScale + IBLColor;\n'; + fragmentShader += ' color += IBLColor;\n'; } if (defined(parameterValues.occlusionTexture)) { From 7d6640090fc59887d95d9a8d303be0b7877e3f5f Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 5 Apr 2018 17:09:30 -0400 Subject: [PATCH 3/7] CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index e67cb71e0711..23ca469ac30c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ Change Log * Fixed bugs in `TimeIntervalCollection.removeInterval`. [#6418](https://github.com/AnalyticalGraphicsInc/cesium/pull/6418). * Fixed glTF support to handle meshes with and without tangent vectors, and with/without morph targets, sharing one material. [#6421](https://github.com/AnalyticalGraphicsInc/cesium/pull/6421) * Fixed glTF support to handle skinned meshes when no skin is supplied. [#6061](https://github.com/AnalyticalGraphicsInc/cesium/issues/6061) +* Updated glTF 2.0 PBR shader to have brighter lighting. [#6430](https://github.com/AnalyticalGraphicsInc/cesium/pull/6430) * Allow loadWithXhr to work with string URLs in a web worker. ### 1.44 - 2018-04-02 From 21d2e85d34ce4e8f66005efe460116765a812d47 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Mon, 9 Apr 2018 14:00:38 -0400 Subject: [PATCH 4/7] Tweak high-roughness lighting to be friendlier to non-PBR models. --- .../GltfPipeline/processPbrMetallicRoughness.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js index 2a6c89615811..7d9391ced0cb 100644 --- a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js +++ b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js @@ -585,17 +585,18 @@ define([ fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.2, 0.3, 0.45), vec3(0.4, 0.7, 0.9), smoothstepHeight);\n'; fragmentShader += ' vec3 nadirColor = belowHorizonColor * 0.5;\n'; fragmentShader += ' vec3 aboveHorizonColor = vec3(0.9, 0.95, 1.0);\n'; - fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.5);\n'; + fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.75);\n'; fragmentShader += ' vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, smoothstepHeight);\n'; - fragmentShader += ' float diffuseIrradianceFromEarth = (1.0 - horizonDotNadir) * (reflectionDotNadir * 0.25 + 0.5) * smoothstepHeight;\n'; + fragmentShader += ' vec3 blueSkyDiffuseColor = vec3(0.7, 0.85, 0.9);\n'; + fragmentShader += ' float diffuseIrradianceFromEarth = (1.0 - horizonDotNadir) * (reflectionDotNadir * 0.25 + 0.75) * smoothstepHeight;\n'; fragmentShader += ' float diffuseIrradianceFromSky = (1.0 - smoothstepHeight) * (1.0 - (reflectionDotNadir * 0.25 + 0.25));\n'; - fragmentShader += ' vec3 diffuseIrradiance = blueSkyColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0);\n'; + fragmentShader += ' vec3 diffuseIrradiance = blueSkyDiffuseColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0);\n'; - fragmentShader += ' float fullBlur = 1.0 - roughness * (horizonDotNadir * 0.25 + 0.5);\n'; - fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * fullBlur);\n'; + fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * inverseRoughness);\n'; fragmentShader += ' specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, reflectionDotNadir) * inverseRoughness);\n'; fragmentShader += ' specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n'; + fragmentShader += ' specularIrradiance = mix(specularIrradiance, blueSkyColor, (1.0 - inverseRoughness) * (1.1 - horizonDotNadir));\n'; fragmentShader += ' vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, 1.0 - roughness)).rg;\n'; fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * (specularColor * brdfLut.x + brdfLut.y));\n'; From 34fafb5c09b88b00c277d6fbed58dd8e91aaab06 Mon Sep 17 00:00:00 2001 From: Alex Wood Date: Thu, 19 Apr 2018 16:55:25 -0400 Subject: [PATCH 5/7] Clamp horizonDotNadir calculation to effectively push any subsurface position up to the surface. Without this, geometry positioned close to the center of the Earth will turn white. --- Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js index 7d9391ced0cb..f902979a78d5 100644 --- a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js +++ b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js @@ -538,7 +538,7 @@ define([ // Figure out if the reflection vector hits the ellipsoid fragmentShader += ' czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n'; fragmentShader += ' float vertexRadius = length(v_positionWC);\n'; - fragmentShader += ' float horizonDotNadir = 1.0 - ellipsoid.radii.x / vertexRadius;\n'; + fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid.radii.x / vertexRadius);\n'; fragmentShader += ' float reflectionDotNadir = dot(r, normalize(v_positionWC));\n'; // Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z. fragmentShader += ' r.x = -r.x;\n'; From f513600f98ecb58e39816cedee2b56cc6d880cfb Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 26 Apr 2018 17:59:58 -0400 Subject: [PATCH 6/7] Rebalance some gradients to not look washed out. --- .../GltfPipeline/processPbrMetallicRoughness.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js index f902979a78d5..f8b19e4ff5dc 100644 --- a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js +++ b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js @@ -570,21 +570,21 @@ define([ fragmentShader += ' vec3 color = NdotL * lightColor * (diffuseContribution + specularContribution);\n'; if (optimizeForCesium) { - fragmentShader += ' float inverseRoughness = 1.0 - roughness;\n'; + fragmentShader += ' float inverseRoughness = 1.04 - roughness;\n'; fragmentShader += ' inverseRoughness *= inverseRoughness;\n'; fragmentShader += ' vec3 sceneSkyBox = textureCube(czm_environmentMap, r).rgb * inverseRoughness;\n'; fragmentShader += ' float atmosphereHeight = 0.05;\n'; fragmentShader += ' float blendRegionSize = 0.1 * ((1.0 - inverseRoughness) * 8.0 + 1.1 - horizonDotNadir);\n'; - fragmentShader += ' float blendRegionOffset = roughness * -1.5;\n'; + fragmentShader += ' float blendRegionOffset = roughness * -1.0;\n'; fragmentShader += ' float farAboveHorizon = clamp(horizonDotNadir - blendRegionSize * 0.5 + blendRegionOffset, 1.0e-10 - blendRegionSize, 0.99999);\n'; fragmentShader += ' float aroundHorizon = clamp(horizonDotNadir + blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999);\n'; fragmentShader += ' float farBelowHorizon = clamp(horizonDotNadir + blendRegionSize * 1.5, 1.0e-10 - blendRegionSize, 0.99999);\n'; fragmentShader += ' float smoothstepHeight = smoothstep(0.0, atmosphereHeight, horizonDotNadir);\n'; - fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.2, 0.3, 0.45), vec3(0.4, 0.7, 0.9), smoothstepHeight);\n'; + fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.1, 0.15, 0.25), vec3(0.4, 0.7, 0.9), smoothstepHeight);\n'; fragmentShader += ' vec3 nadirColor = belowHorizonColor * 0.5;\n'; - fragmentShader += ' vec3 aboveHorizonColor = vec3(0.9, 0.95, 1.0);\n'; + fragmentShader += ' vec3 aboveHorizonColor = mix(vec3(0.9, 1.0, 1.2), belowHorizonColor, roughness * 0.5);\n'; fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.18, 0.26, 0.48), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.75);\n'; fragmentShader += ' vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, smoothstepHeight);\n'; @@ -593,10 +593,10 @@ define([ fragmentShader += ' float diffuseIrradianceFromSky = (1.0 - smoothstepHeight) * (1.0 - (reflectionDotNadir * 0.25 + 0.25));\n'; fragmentShader += ' vec3 diffuseIrradiance = blueSkyDiffuseColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0);\n'; - fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * inverseRoughness);\n'; + fragmentShader += ' float notDistantRough = (1.0 - horizonDotNadir * roughness * 0.8);\n'; + fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * notDistantRough);\n'; fragmentShader += ' specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, reflectionDotNadir) * inverseRoughness);\n'; fragmentShader += ' specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n'; - fragmentShader += ' specularIrradiance = mix(specularIrradiance, blueSkyColor, (1.0 - inverseRoughness) * (1.1 - horizonDotNadir));\n'; fragmentShader += ' vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, 1.0 - roughness)).rg;\n'; fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * (specularColor * brdfLut.x + brdfLut.y));\n'; From b86b871eaee4f66a68c66758db86b471d9c4fef8 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 26 Apr 2018 21:43:40 -0400 Subject: [PATCH 7/7] Tweak linear/sRGB placement, add missing term from diffuseColor. --- .../GltfPipeline/processPbrMetallicRoughness.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js index f8b19e4ff5dc..eb3c0effc1c9 100644 --- a/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js +++ b/Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js @@ -422,7 +422,12 @@ define([ ' return roughnessSquared / (M_PI * f * f);\n' + '}\n\n'; - fragmentShader += 'vec4 SRGBtoLINEAR(vec4 srgbIn) \n' + + fragmentShader += 'vec3 SRGBtoLINEAR3(vec3 srgbIn) \n' + + '{\n' + + ' return pow(srgbIn, vec3(2.2));\n' + + '}\n\n'; + + fragmentShader += 'vec4 SRGBtoLINEAR4(vec4 srgbIn) \n' + '{\n' + ' vec3 linearOut = pow(srgbIn.rgb, vec3(2.2));\n' + ' return vec4(linearOut, srgbIn.a);\n' + @@ -481,7 +486,7 @@ define([ // Add base color to fragment shader if (defined(parameterValues.baseColorTexture)) { - fragmentShader += ' vec4 baseColorWithAlpha = SRGBtoLINEAR(texture2D(u_baseColorTexture, ' + v_texcoord + '));\n'; + fragmentShader += ' vec4 baseColorWithAlpha = SRGBtoLINEAR4(texture2D(u_baseColorTexture, ' + v_texcoord + '));\n'; if (defined(parameterValues.baseColorFactor)) { fragmentShader += ' baseColorWithAlpha *= u_baseColorFactor;\n'; } @@ -555,7 +560,7 @@ define([ fragmentShader += ' vec3 f0 = vec3(0.04);\n'; fragmentShader += ' float alpha = roughness * roughness;\n'; - fragmentShader += ' vec3 diffuseColor = baseColor * (1.0 - metalness);\n'; + fragmentShader += ' vec3 diffuseColor = baseColor * (1.0 - metalness) * (1.0 - f0);\n'; fragmentShader += ' vec3 specularColor = mix(f0, baseColor, metalness);\n'; fragmentShader += ' float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\n'; fragmentShader += ' vec3 r90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0));\n'; @@ -599,7 +604,7 @@ define([ fragmentShader += ' specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n'; fragmentShader += ' vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, 1.0 - roughness)).rg;\n'; - fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * (specularColor * brdfLut.x + brdfLut.y));\n'; + fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * SRGBtoLINEAR3(specularColor * brdfLut.x + brdfLut.y));\n'; fragmentShader += ' color += IBLColor;\n'; } @@ -607,7 +612,7 @@ define([ fragmentShader += ' color *= texture2D(u_occlusionTexture, ' + v_texcoord + ').r;\n'; } if (defined(parameterValues.emissiveTexture)) { - fragmentShader += ' vec3 emissive = SRGBtoLINEAR(texture2D(u_emissiveTexture, ' + v_texcoord + ')).rgb;\n'; + fragmentShader += ' vec3 emissive = SRGBtoLINEAR3(texture2D(u_emissiveTexture, ' + v_texcoord + ').rgb);\n'; if (defined(parameterValues.emissiveFactor)) { fragmentShader += ' emissive *= u_emissiveFactor;\n'; }