@@ -389,9 +389,9 @@ define([
389
389
// Fragment shader lighting
390
390
fragmentShader += 'const float M_PI = 3.141592653589793;\n' ;
391
391
392
- fragmentShader += 'vec3 lambertianDiffuse(vec3 baseColor ) \n' +
392
+ fragmentShader += 'vec3 lambertianDiffuse(vec3 diffuseColor ) \n' +
393
393
'{\n' +
394
- ' return baseColor / M_PI;\n' +
394
+ ' return diffuseColor / M_PI;\n' +
395
395
'}\n\n' ;
396
396
397
397
fragmentShader += 'vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH) \n' +
@@ -422,6 +422,22 @@ define([
422
422
' return roughnessSquared / (M_PI * f * f);\n' +
423
423
'}\n\n' ;
424
424
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' +
431
+ '{\n' +
432
+ ' vec3 linearOut = pow(srgbIn.rgb, vec3(2.2));\n' +
433
+ ' return vec4(linearOut, srgbIn.a);\n' +
434
+ '}\n\n' ;
435
+
436
+ fragmentShader += 'vec3 LINEARtoSRGB(vec3 linearIn) \n' +
437
+ '{\n' +
438
+ ' return pow(linearIn, vec3(1.0/2.2));\n' +
439
+ '}\n\n' ;
440
+
425
441
fragmentShader += 'void main(void) \n{\n' ;
426
442
427
443
// Add normal mapping to fragment shader
@@ -470,7 +486,7 @@ define([
470
486
471
487
// Add base color to fragment shader
472
488
if ( defined ( parameterValues . baseColorTexture ) ) {
473
- fragmentShader += ' vec4 baseColorWithAlpha = texture2D(u_baseColorTexture, ' + v_texcoord + ');\n' ;
489
+ fragmentShader += ' vec4 baseColorWithAlpha = SRGBtoLINEAR4( texture2D(u_baseColorTexture, ' + v_texcoord + ') );\n' ;
474
490
if ( defined ( parameterValues . baseColorFactor ) ) {
475
491
fragmentShader += ' baseColorWithAlpha *= u_baseColorFactor;\n' ;
476
492
}
@@ -513,10 +529,12 @@ define([
513
529
fragmentShader += ' vec3 v = -normalize(v_positionEC);\n' ;
514
530
515
531
// Generate fragment shader's lighting block
516
- fragmentShader += ' vec3 lightColor = vec3(1.0, 1.0, 1.0);\n' ;
517
532
if ( optimizeForCesium ) {
533
+ // The Sun is brighter than your average light source, and has a yellowish tint balanced by the Earth's ambient blue.
534
+ fragmentShader += ' vec3 lightColor = vec3(1.5, 1.4, 1.2);\n' ;
518
535
fragmentShader += ' vec3 l = normalize(czm_sunDirectionEC);\n' ;
519
536
} else {
537
+ fragmentShader += ' vec3 lightColor = vec3(1.0, 1.0, 1.0);\n' ;
520
538
fragmentShader += ' vec3 l = vec3(0.0, 0.0, 1.0);\n' ;
521
539
}
522
540
fragmentShader += ' vec3 h = normalize(v + l);\n' ;
@@ -525,7 +543,7 @@ define([
525
543
// Figure out if the reflection vector hits the ellipsoid
526
544
fragmentShader += ' czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n' ;
527
545
fragmentShader += ' float vertexRadius = length(v_positionWC);\n' ;
528
- fragmentShader += ' float horizonDotNadir = 1.0 - ellipsoid.radii.x / vertexRadius;\n' ;
546
+ fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid.radii.x / vertexRadius) ;\n' ;
529
547
fragmentShader += ' float reflectionDotNadir = dot(r, normalize(v_positionWC));\n' ;
530
548
// Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z.
531
549
fragmentShader += ' r.x = -r.x;\n' ;
@@ -542,7 +560,7 @@ define([
542
560
543
561
fragmentShader += ' vec3 f0 = vec3(0.04);\n' ;
544
562
fragmentShader += ' float alpha = roughness * roughness;\n' ;
545
- fragmentShader += ' vec3 diffuseColor = baseColor * (1.0 - metalness);\n' ;
563
+ fragmentShader += ' vec3 diffuseColor = baseColor * (1.0 - metalness) * (1.0 - f0) ;\n' ;
546
564
fragmentShader += ' vec3 specularColor = mix(f0, baseColor, metalness);\n' ;
547
565
fragmentShader += ' float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\n' ;
548
566
fragmentShader += ' vec3 r90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0));\n' ;
@@ -552,44 +570,49 @@ define([
552
570
fragmentShader += ' float G = smithVisibilityGGX(alpha, NdotL, NdotV);\n' ;
553
571
fragmentShader += ' float D = GGX(alpha, NdotH);\n' ;
554
572
555
- fragmentShader += ' vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(baseColor );\n' ;
573
+ fragmentShader += ' vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor );\n' ;
556
574
fragmentShader += ' vec3 specularContribution = F * G * D / (4.0 * NdotL * NdotV);\n' ;
557
575
fragmentShader += ' vec3 color = NdotL * lightColor * (diffuseContribution + specularContribution);\n' ;
558
576
559
577
if ( optimizeForCesium ) {
560
- fragmentShader += ' float inverseRoughness = 1.0 - roughness;\n' ;
578
+ fragmentShader += ' float inverseRoughness = 1.04 - roughness;\n' ;
561
579
fragmentShader += ' inverseRoughness *= inverseRoughness;\n' ;
562
580
fragmentShader += ' vec3 sceneSkyBox = textureCube(czm_environmentMap, r).rgb * inverseRoughness;\n' ;
563
581
564
582
fragmentShader += ' float atmosphereHeight = 0.05;\n' ;
565
583
fragmentShader += ' float blendRegionSize = 0.1 * ((1.0 - inverseRoughness) * 8.0 + 1.1 - horizonDotNadir);\n' ;
566
- fragmentShader += ' float farAboveHorizon = clamp(horizonDotNadir - blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999);\n' ;
584
+ fragmentShader += ' float blendRegionOffset = roughness * -1.0;\n' ;
585
+ fragmentShader += ' float farAboveHorizon = clamp(horizonDotNadir - blendRegionSize * 0.5 + blendRegionOffset, 1.0e-10 - blendRegionSize, 0.99999);\n' ;
567
586
fragmentShader += ' float aroundHorizon = clamp(horizonDotNadir + blendRegionSize * 0.5, 1.0e-10 - blendRegionSize, 0.99999);\n' ;
568
587
fragmentShader += ' float farBelowHorizon = clamp(horizonDotNadir + blendRegionSize * 1.5, 1.0e-10 - blendRegionSize, 0.99999);\n' ;
569
588
fragmentShader += ' float smoothstepHeight = smoothstep(0.0, atmosphereHeight, horizonDotNadir);\n' ;
570
- fragmentShader += ' float lightScale = smoothstepHeight * 1.5 + 1.0;\n' ;
571
589
572
- fragmentShader += ' vec3 diffuseIrradiance = mix(vec3(0.5), vec3(0.05), smoothstepHeight);\n' ;
573
- fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.1, 0.2, 0.4), vec3(0.2, 0.5, 0.7), smoothstepHeight);\n' ;
590
+ fragmentShader += ' vec3 belowHorizonColor = mix(vec3(0.1, 0.15, 0.25), vec3(0.4, 0.7, 0.9), smoothstepHeight);\n' ;
574
591
fragmentShader += ' vec3 nadirColor = belowHorizonColor * 0.5;\n' ;
575
- fragmentShader += ' vec3 aboveHorizonColor = vec3(0.8, 0.9, 0.95 );\n' ;
576
- fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.09 , 0.13 , 0.24 ), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.5 );\n' ;
592
+ fragmentShader += ' vec3 aboveHorizonColor = mix( vec3(0.9, 1.0, 1.2), belowHorizonColor, roughness * 0.5 );\n' ;
593
+ fragmentShader += ' vec3 blueSkyColor = mix(vec3(0.18 , 0.26 , 0.48 ), aboveHorizonColor, reflectionDotNadir * inverseRoughness * 0.5 + 0.75 );\n' ;
577
594
fragmentShader += ' vec3 zenithColor = mix(blueSkyColor, sceneSkyBox, smoothstepHeight);\n' ;
578
595
579
- fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * inverseRoughness);\n' ;
596
+ fragmentShader += ' vec3 blueSkyDiffuseColor = vec3(0.7, 0.85, 0.9);\n' ;
597
+ fragmentShader += ' float diffuseIrradianceFromEarth = (1.0 - horizonDotNadir) * (reflectionDotNadir * 0.25 + 0.75) * smoothstepHeight;\n' ;
598
+ fragmentShader += ' float diffuseIrradianceFromSky = (1.0 - smoothstepHeight) * (1.0 - (reflectionDotNadir * 0.25 + 0.25));\n' ;
599
+ fragmentShader += ' vec3 diffuseIrradiance = blueSkyDiffuseColor * clamp(diffuseIrradianceFromEarth + diffuseIrradianceFromSky, 0.0, 1.0);\n' ;
600
+
601
+ fragmentShader += ' float notDistantRough = (1.0 - horizonDotNadir * roughness * 0.8);\n' ;
602
+ fragmentShader += ' vec3 specularIrradiance = mix(zenithColor, aboveHorizonColor, smoothstep(farAboveHorizon, aroundHorizon, reflectionDotNadir) * notDistantRough);\n' ;
580
603
fragmentShader += ' specularIrradiance = mix(specularIrradiance, belowHorizonColor, smoothstep(aroundHorizon, farBelowHorizon, reflectionDotNadir) * inverseRoughness);\n' ;
581
604
fragmentShader += ' specularIrradiance = mix(specularIrradiance, nadirColor, smoothstep(farBelowHorizon, 1.0, reflectionDotNadir) * inverseRoughness);\n' ;
582
605
583
606
fragmentShader += ' vec2 brdfLut = texture2D(czm_brdfLut, vec2(NdotV, 1.0 - roughness)).rg;\n' ;
584
- fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * (specularColor * brdfLut.x + brdfLut.y));\n' ;
585
- fragmentShader += ' color = color * lightScale + IBLColor;\n' ;
607
+ fragmentShader += ' vec3 IBLColor = (diffuseIrradiance * diffuseColor) + (specularIrradiance * SRGBtoLINEAR3 (specularColor * brdfLut.x + brdfLut.y));\n' ;
608
+ fragmentShader += ' color += IBLColor;\n' ;
586
609
}
587
610
588
611
if ( defined ( parameterValues . occlusionTexture ) ) {
589
612
fragmentShader += ' color *= texture2D(u_occlusionTexture, ' + v_texcoord + ').r;\n' ;
590
613
}
591
614
if ( defined ( parameterValues . emissiveTexture ) ) {
592
- fragmentShader += ' vec3 emissive = texture2D(u_emissiveTexture, ' + v_texcoord + ').rgb;\n' ;
615
+ fragmentShader += ' vec3 emissive = SRGBtoLINEAR3( texture2D(u_emissiveTexture, ' + v_texcoord + ').rgb) ;\n' ;
593
616
if ( defined ( parameterValues . emissiveFactor ) ) {
594
617
fragmentShader += ' emissive *= u_emissiveFactor;\n' ;
595
618
}
@@ -602,6 +625,7 @@ define([
602
625
}
603
626
604
627
// Final color
628
+ fragmentShader += ' color = LINEARtoSRGB(color);\n' ;
605
629
var alphaMode = material . alphaMode ;
606
630
if ( defined ( alphaMode ) ) {
607
631
if ( alphaMode === 'MASK' ) {
0 commit comments