Skip to content

Commit b86b871

Browse files
committed
Tweak linear/sRGB placement, add missing term from diffuseColor.
1 parent 8a381c5 commit b86b871

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

Source/ThirdParty/GltfPipeline/processPbrMetallicRoughness.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,12 @@ define([
422422
' return roughnessSquared / (M_PI * f * f);\n' +
423423
'}\n\n';
424424

425-
fragmentShader += 'vec4 SRGBtoLINEAR(vec4 srgbIn) \n' +
425+
fragmentShader += 'vec3 SRGBtoLINEAR3(vec3 srgbIn) \n' +
426+
'{\n' +
427+
' return pow(srgbIn, vec3(2.2));\n' +
428+
'}\n\n';
429+
430+
fragmentShader += 'vec4 SRGBtoLINEAR4(vec4 srgbIn) \n' +
426431
'{\n' +
427432
' vec3 linearOut = pow(srgbIn.rgb, vec3(2.2));\n' +
428433
' return vec4(linearOut, srgbIn.a);\n' +
@@ -481,7 +486,7 @@ define([
481486

482487
// Add base color to fragment shader
483488
if (defined(parameterValues.baseColorTexture)) {
484-
fragmentShader += ' vec4 baseColorWithAlpha = SRGBtoLINEAR(texture2D(u_baseColorTexture, ' + v_texcoord + '));\n';
489+
fragmentShader += ' vec4 baseColorWithAlpha = SRGBtoLINEAR4(texture2D(u_baseColorTexture, ' + v_texcoord + '));\n';
485490
if (defined(parameterValues.baseColorFactor)) {
486491
fragmentShader += ' baseColorWithAlpha *= u_baseColorFactor;\n';
487492
}
@@ -555,7 +560,7 @@ define([
555560

556561
fragmentShader += ' vec3 f0 = vec3(0.04);\n';
557562
fragmentShader += ' float alpha = roughness * roughness;\n';
558-
fragmentShader += ' vec3 diffuseColor = baseColor * (1.0 - metalness);\n';
563+
fragmentShader += ' vec3 diffuseColor = baseColor * (1.0 - metalness) * (1.0 - f0);\n';
559564
fragmentShader += ' vec3 specularColor = mix(f0, baseColor, metalness);\n';
560565
fragmentShader += ' float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\n';
561566
fragmentShader += ' vec3 r90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0));\n';
@@ -599,15 +604,15 @@ define([
599604
fragmentShader += ' specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n';
600605

601606
fragmentShader += ' vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, 1.0 - roughness)).rg;\n';
602-
fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * (specularColor * brdfLut.x + brdfLut.y));\n';
607+
fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * SRGBtoLINEAR3(specularColor * brdfLut.x + brdfLut.y));\n';
603608
fragmentShader += ' color += IBLColor;\n';
604609
}
605610

606611
if (defined(parameterValues.occlusionTexture)) {
607612
fragmentShader += ' color *= texture2D(u_occlusionTexture, ' + v_texcoord + ').r;\n';
608613
}
609614
if (defined(parameterValues.emissiveTexture)) {
610-
fragmentShader += ' vec3 emissive = SRGBtoLINEAR(texture2D(u_emissiveTexture, ' + v_texcoord + ')).rgb;\n';
615+
fragmentShader += ' vec3 emissive = SRGBtoLINEAR3(texture2D(u_emissiveTexture, ' + v_texcoord + ').rgb);\n';
611616
if (defined(parameterValues.emissiveFactor)) {
612617
fragmentShader += ' emissive *= u_emissiveFactor;\n';
613618
}

0 commit comments

Comments
 (0)