@babylonjs/viewer
Version:
The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.
3 lines (2 loc) • 3.42 kB
JavaScript
function e(e,n="",r=""){if(r)return r;return`${n||"let R_raw = reflect(-V, N);"}\nlet R = rotateY(R_raw, scene.envRotationY);\nlet N_env = rotateY(N, scene.envRotationY);\nlet brdf = textureSample(brdfLUT, brdfSampler_, vec2<f32>(NdotV, roughness));\nlet environmentBrdf = brdf.rgb;\nlet specularEnvironmentReflectance = (colorF90 - colorF0) * environmentBrdf.x + colorF0 * environmentBrdf.y;\nlet seo = clamp((NdotVUnclamped + occlusion) * (NdotVUnclamped + occlusion) - 1.0 + occlusion, 0.0, 1.0);\n${e?"let eho = environmentHorizonOcclusion(-V, N, N_geom);":"let eho = 1.0;"}\nlet colorSpecularEnvReflectance = specularEnvironmentReflectance * seo * eho;\nlet energyConservation = getEnergyConservationFactor(colorF0, max(environmentBrdf.y, 0.001));\nlet environmentIrradiance = (scene.vSphericalL00.rgb\n + scene.vSphericalL1_1.rgb * N_env.y + scene.vSphericalL10.rgb * N_env.z + scene.vSphericalL11.rgb * N_env.x\n + scene.vSphericalL2_2.rgb * (N_env.y * N_env.x) + scene.vSphericalL2_1.rgb * (N_env.y * N_env.z)\n + scene.vSphericalL20.rgb * (3.0 * N_env.z * N_env.z - 1.0) + scene.vSphericalL21.rgb * (N_env.z * N_env.x)\n + scene.vSphericalL22.rgb * (N_env.x * N_env.x - N_env.y * N_env.y)) * material.environmentIntensity;\nlet maxLod = f32(textureNumLevels(iblTexture) - 1);\nlet cubemapDim = f32(textureDimensions(iblTexture).x);\nvar specLod = log2(cubemapDim * alphaG) * scene.vImageInfos.z;\nvar environmentRadiance = textureSampleLevel(iblTexture, iblSampler, R, clamp(specLod, 0.0, maxLod)).rgb * material.environmentIntensity;\nenvironmentRadiance = mix(environmentRadiance, environmentIrradiance, alphaG);\nlet finalIrradiance = environmentIrradiance * surfaceAlbedo * occlusion;\nlet finalSpecularScaled = directSpecular * energyConservation;\nlet finalRadianceScaled = environmentRadiance * colorSpecularEnvReflectance * energyConservation;\ncolor = finalIrradiance + finalRadianceScaled + finalSpecularScaled + directDiffuse + emissive;`}function n(n,r="",t=""){return{_id:"ibl",_bindings:[{_name:"brdfLUT",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"brdfSampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2},{_name:"iblTexture",_type:{_kind:"texture",_textureType:"texture_cube<f32>"},_visibility:2},{_name:"iblSampler",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}],_helperFunctions:"\nfn environmentHorizonOcclusion(V: vec3<f32>, N: vec3<f32>, geoN: vec3<f32>) -> f32 {\nlet R = reflect(V, N);\nlet temp = saturate(1.0 + 1.1 * dot(R, geoN));\nreturn temp * temp;\n}\nfn getEnergyConservationFactor(F0: vec3<f32>, brdfY: f32) -> vec3<f32> {\nreturn 1.0 + F0 * (1.0 / brdfY - 1.0);\n}\nfn rotateY(v: vec3<f32>, angle: f32) -> vec3<f32> {\nlet c = cos(angle);\nlet s = sin(angle);\nreturn vec3<f32>(v.x * c + v.z * s, v.y, -v.x * s + v.z * c);\n}\n",_fragmentSlots:{AI:e(n,r,t),BA:"luminanceOverAlpha += dot(finalRadianceScaled, vec3<f32>(0.2126, 0.7152, 0.0722));"}}}const r={id:"ibl",phase:"ibl",frag:e=>e._hasIbl?n(e._hasAnyNormal,e._anisoBentNormalCode??"",e._iblSkyboxCalc??""):null,bind:(e,n,r)=>e._env?(n.push({binding:r++,resource:e._env.brdfLutView}),n.push({binding:r++,resource:e._env.brdfSampler}),n.push({binding:r++,resource:e._env.specularCubeView}),n.push({binding:r++,resource:e._env.cubeSampler}),r):r};export{n as createIblFragment,r as pbrExt};
//# sourceMappingURL=ibl-fragment-DmravZIP.esm.min.js.map