Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | //This file is automatically rebuilt by the Cesium build process.
export default "vec3 lambertianDiffuse(vec3 diffuseColor)\n\
{\n\
return diffuseColor / czm_pi;\n\
}\n\
\n\
vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH)\n\
{\n\
float versine = 1.0 - VdotH;\n\
// pow(versine, 5.0) is slow. See https://stackoverflow.com/a/68793086/10082269\n\
float versineSquared = versine * versine;\n\
return f0 + (f90 - f0) * versineSquared * versineSquared * versine;\n\
}\n\
\n\
#ifdef USE_ANISOTROPY\n\
/**\n\
* @param {float} bitangentRoughness Material roughness (along the anisotropy bitangent)\n\
* @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent)\n\
* @param {vec3} lightDirection The direction from the fragment to the light source, transformed to tangent-bitangent-normal coordinates\n\
* @param {vec3} viewDirection The direction from the fragment to the camera, transformed to tangent-bitangent-normal coordinates\n\
*/\n\
float smithVisibilityGGX_anisotropic(float bitangentRoughness, float tangentialRoughness, vec3 lightDirection, vec3 viewDirection)\n\
{\n\
vec3 roughnessScale = vec3(tangentialRoughness, bitangentRoughness, 1.0);\n\
float GGXV = lightDirection.z * length(roughnessScale * viewDirection);\n\
float GGXL = viewDirection.z * length(roughnessScale * lightDirection);\n\
float v = 0.5 / (GGXV + GGXL);\n\
return clamp(v, 0.0, 1.0);\n\
}\n\
\n\
/**\n\
* @param {float} bitangentRoughness Material roughness (along the anisotropy bitangent)\n\
* @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent)\n\
* @param {vec3} halfwayDirection The unit vector halfway between light and view directions, transformed to tangent-bitangent-normal coordinates\n\
*/\n\
float GGX_anisotropic(float bitangentRoughness, float tangentialRoughness, vec3 halfwayDirection)\n\
{\n\
float roughnessSquared = bitangentRoughness * tangentialRoughness;\n\
vec3 f = halfwayDirection * vec3(bitangentRoughness, tangentialRoughness, roughnessSquared);\n\
float w2 = roughnessSquared / dot(f, f);\n\
return roughnessSquared * w2 * w2 / czm_pi;\n\
}\n\
#endif\n\
\n\
/**\n\
* Estimate the geometric self-shadowing of the microfacets in a surface,\n\
* using the Smith Joint GGX visibility function.\n\
* Note: Vis = G / (4 * NdotL * NdotV)\n\
* see Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3\n\
* see Real-Time Rendering. Page 331 to 336.\n\
* see https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg)\n\
*\n\
* @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness.\n\
* @param {float} NdotL The cosine of the angle between the surface normal and the direction to the light source.\n\
* @param {float} NdotV The cosine of the angle between the surface normal and the direction to the camera.\n\
*/\n\
float smithVisibilityGGX(float alphaRoughness, float NdotL, float NdotV)\n\
{\n\
float alphaRoughnessSq = alphaRoughness * alphaRoughness;\n\
\n\
float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq);\n\
float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq);\n\
\n\
float GGX = GGXV + GGXL;\n\
if (GGX > 0.0)\n\
{\n\
return 0.5 / GGX;\n\
}\n\
return 0.0;\n\
}\n\
\n\
/**\n\
* Estimate the fraction of the microfacets in a surface that are aligned with \n\
* the halfway vector, which is aligned halfway between the directions from\n\
* the fragment to the camera and from the fragment to the light source.\n\
*\n\
* @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness.\n\
* @param {float} NdotH The cosine of the angle between the surface normal and the halfway vector.\n\
* @return {float} The fraction of microfacets aligned to the halfway vector.\n\
*/\n\
float GGX(float alphaRoughness, float NdotH)\n\
{\n\
float alphaRoughnessSquared = alphaRoughness * alphaRoughness;\n\
float f = (NdotH * alphaRoughnessSquared - NdotH) * NdotH + 1.0;\n\
return alphaRoughnessSquared / (czm_pi * f * f);\n\
}\n\
\n\
/**\n\
* Compute the strength of the specular reflection due to direct lighting.\n\
*\n\
* @param {vec3} normal The surface normal.\n\
* @param {vec3} lightDirection The unit vector pointing from the fragment to the light source.\n\
* @param {vec3} viewDirection The unit vector pointing from the fragment to the camera.\n\
* @param {vec3} halfwayDirection The unit vector pointing from the fragment to halfway between the light source and the camera.\n\
* @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness.\n\
* @return {float} The strength of the specular reflection.\n\
*/\n\
float computeDirectSpecularStrength(vec3 normal, vec3 lightDirection, vec3 viewDirection, vec3 halfwayDirection, float alphaRoughness)\n\
{\n\
float NdotL = clamp(dot(normal, lightDirection), 0.0, 1.0);\n\
float NdotV = clamp(dot(normal, viewDirection), 0.0, 1.0);\n\
float G = smithVisibilityGGX(alphaRoughness, NdotL, NdotV);\n\
float NdotH = clamp(dot(normal, halfwayDirection), 0.0, 1.0);\n\
float D = GGX(alphaRoughness, NdotH);\n\
return G * D;\n\
}\n\
\n\
/**\n\
* Compute the diffuse and specular contributions using physically based\n\
* rendering. This function only handles direct lighting.\n\
* <p>\n\
* This function only handles the lighting calculations. Metallic/roughness\n\
* and specular/glossy must be handled separately. See {@MaterialStageFS}\n\
* </p>\n\
*\n\
* @name czm_pbrLighting\n\
* @glslFunction\n\
*\n\
* @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position\n\
* @param {vec3} normalEC The surface normal in eye coordinates\n\
* @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates.\n\
* @param {czm_modelMaterial} The material properties.\n\
* @return {vec3} The computed HDR color\n\
*/\n\
vec3 czm_pbrLighting(vec3 viewDirectionEC, vec3 normalEC, vec3 lightDirectionEC, czm_modelMaterial material)\n\
{\n\
vec3 halfwayDirectionEC = normalize(viewDirectionEC + lightDirectionEC);\n\
float VdotH = clamp(dot(viewDirectionEC, halfwayDirectionEC), 0.0, 1.0);\n\
float NdotL = clamp(dot(normalEC, lightDirectionEC), 0.001, 1.0);\n\
\n\
vec3 f0 = material.specular;\n\
float reflectance = czm_maximumComponent(f0);\n\
// Typical dielectrics will have reflectance 0.04, so f90 will be 1.0.\n\
// In this case, at grazing angle, all incident energy is reflected.\n\
vec3 f90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0));\n\
vec3 F = fresnelSchlick2(f0, f90, VdotH);\n\
\n\
#if defined(USE_SPECULAR)\n\
F *= material.specularWeight;\n\
#endif\n\
\n\
float alphaRoughness = material.roughness * material.roughness;\n\
#ifdef USE_ANISOTROPY\n\
mat3 tbn = mat3(material.anisotropicT, material.anisotropicB, normalEC);\n\
vec3 lightDirection = lightDirectionEC * tbn;\n\
vec3 viewDirection = viewDirectionEC * tbn;\n\
vec3 halfwayDirection = halfwayDirectionEC * tbn;\n\
float anisotropyStrength = material.anisotropyStrength;\n\
float tangentialRoughness = mix(alphaRoughness, 1.0, anisotropyStrength * anisotropyStrength);\n\
float bitangentRoughness = clamp(alphaRoughness, 0.001, 1.0);\n\
float G = smithVisibilityGGX_anisotropic(bitangentRoughness, tangentialRoughness, lightDirection, viewDirection);\n\
float D = GGX_anisotropic(bitangentRoughness, tangentialRoughness, halfwayDirection);\n\
vec3 specularContribution = F * G * D;\n\
#else\n\
float specularStrength = computeDirectSpecularStrength(normalEC, lightDirectionEC, viewDirectionEC, halfwayDirectionEC, alphaRoughness);\n\
vec3 specularContribution = F * specularStrength;\n\
#endif\n\
\n\
vec3 diffuseColor = material.diffuse;\n\
// F here represents the specular contribution\n\
vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor);\n\
\n\
// Lo = (diffuse + specular) * Li * NdotL\n\
return (diffuseContribution + specularContribution) * NdotL;\n\
}\n\
";
|