UNPKG

@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) 6.13 kB
import{aD as e,aE as t}from"./index-DFZFpUG-.esm.min.js";const n=1<<22,s=1<<23,r=1<<24;function c(e,t,n,s,r){let c="",a="input.uv",i="input.uv";r&&n&&(c+="let ssColorUV = vec2<f32>(dot(material.translucencyColorUVm.xy, input.uv), dot(material.translucencyColorUVm.zw, input.uv)) + material.translucencyColorUVt.xy;\n",a="ssColorUV"),r&&s&&(c+="let ssIntUV = vec2<f32>(dot(material.translucencyIntensityUVm.xy, input.uv), dot(material.translucencyIntensityUVm.zw, input.uv)) + material.translucencyIntensityUVt.xy;\n",i="ssIntUV");return`${c}${e?`let thicknessSample = textureSample(thicknessTexture_, thicknessSampler_, input.uv).${t?"g":"r"};`:"let thicknessSample = 1.0;"}\nlet ssThickness = max(material.subsurfaceParams.y + thicknessSample * material.subsurfaceParams.z, 0.000001);\nlet ssTranslucencyColor = material.subsurfaceParams3.rgb${n?` * textureSample(translucencyColorTexture_, translucencyColorSampler_, ${a}).rgb`:""};\nlet ssDiffDist = material.subsurfaceParams2.rgb;\nssIntensity = material.subsurfaceParams.x${s?` * textureSample(translucencyIntensityTexture_, translucencyIntensitySampler_, ${i}).a`:""};\nssTransmittance = transmittanceBRDF_Burley(ssTranslucencyColor, ssDiffDist, ssThickness) * ssIntensity;`}function a(e,t,n,s,r,a){const i={_kind:"texture",_textureType:"texture_2d<f32>"},u={_kind:"sampler",_samplerType:"sampler"},l=[];e&&l.push({_name:"thicknessTexture_",_type:i,_visibility:2},{_name:"thicknessSampler_",_type:u,_visibility:2}),s&&l.push({_name:"translucencyColorTexture_",_type:i,_visibility:2},{_name:"translucencyColorSampler_",_type:u,_visibility:2}),r&&l.push({_name:"translucencyIntensityTexture_",_type:i,_visibility:2},{_name:"translucencyIntensitySampler_",_type:u,_visibility:2});const o=[{_name:"subsurfaceParams",_type:"vec4<f32>"},{_name:"subsurfaceParams2",_type:"vec4<f32>"},{_name:"subsurfaceParams3",_type:"vec4<f32>"}];a&&s&&o.push({_name:"translucencyColorUVm",_type:"vec4<f32>"},{_name:"translucencyColorUVt",_type:"vec4<f32>"}),a&&r&&o.push({_name:"translucencyIntensityUVm",_type:"vec4<f32>"},{_name:"translucencyIntensityUVt",_type:"vec4<f32>"});const f={SV:"var translucencyDirect = vec3<f32>(0.0);\nvar ssTransmittance = vec3<f32>(0.0);\nvar ssIntensity = 0.0;",AT:c(e,n,s,r,a),AD:"{\nlet NdotLU = dot(N, L);\nif (NdotLU < 0.0) {\nlet wrapNdotL = computeWrappedDiffuseNdotL(abs(NdotLU), 0.02);\ntranslucencyDirect += (1.0 / PI) * wrapNdotL * ssTransmittance * lightAtten * lightColor * material.directIntensity;\n}\n}"};t?f.AI="{\nlet N_back = -N_env;\nlet envIrrBack = (scene.vSphericalL00.rgb\n + scene.vSphericalL1_1.rgb * N_back.y + scene.vSphericalL10.rgb * N_back.z + scene.vSphericalL11.rgb * N_back.x\n + scene.vSphericalL2_2.rgb * (N_back.y * N_back.x) + scene.vSphericalL2_1.rgb * (N_back.y * N_back.z)\n + scene.vSphericalL20.rgb * (3.0 * N_back.z * N_back.z - 1.0) + scene.vSphericalL21.rgb * (N_back.z * N_back.x)\n + scene.vSphericalL22.rgb * (N_back.x * N_back.x - N_back.y * N_back.y)) * material.environmentIntensity;\nlet refractionIrradiance = envIrrBack * ssTransmittance;\ncolor -= finalIrradiance * ssIntensity;\ncolor += refractionIrradiance * occlusion;\ncolor -= directDiffuse * ssIntensity;\ncolor += translucencyDirect * occlusion;\n}":f.NI="color -= directDiffuse * ssIntensity;\ncolor += translucencyDirect;";const y=[];return t&&y.push("ibl"),{_id:"subsurface",_dependencies:y.length>0?y:void 0,_bindings:l.length>0?l:void 0,_uboFields:o,_helperFunctions:"\nfn transmittanceBRDF_Burley(tintColor: vec3<f32>, diffusionDistance: vec3<f32>, thickness: f32) -> vec3<f32> {\nlet S = 1.0 / max(vec3<f32>(0.000001), diffusionDistance);\nlet temp = exp((-0.333333333 * thickness) * S);\nreturn tintColor * 0.25 * (temp * temp * temp + 3.0 * temp);\n}\nfn computeWrappedDiffuseNdotL(NdotL: f32, w: f32) -> f32 {\nlet t = 1.0 + w;\nlet invt2 = 1.0 / (t * t);\nreturn saturate((NdotL + w) * invt2);\n}\n",_fragmentSlots:f}}function i(e,t,n){const s=t.translucency,r=t.thickness,c=n.get("subsurfaceParams")/4;e[c]=s.intensity??1;const a=r?.min??0,i=r?.max??1;e[c+1]=a,e[c+2]=i-a;const l=n.get("subsurfaceParams2")/4,o=s.diffusionDistance??[1,1,1];e[l]=o[0],e[l+1]=o[1],e[l+2]=o[2];const f=n.get("subsurfaceParams3")/4,y=s.color??[1,1,1];e[f]=y[0],e[f+1]=y[1],e[f+2]=y[2],u(e,n,"translucencyColorUV",s.colorTexture),u(e,n,"translucencyIntensityUV",s.intensityTexture)}function u(e,t,n,s){const r=t.get(`${n}m`),c=t.get(`${n}t`);if(void 0===r||void 0===c)return;const a=s?.uScale??1,i=s?.vScale??1,u=s?.uAng??0,l=r/4;if(0===u)e[l]=a,e[l+1]=0,e[l+2]=0,e[l+3]=i;else{const t=Math.cos(u),n=Math.sin(u);e[l]=t*a,e[l+1]=n*i,e[l+2]=-n*a,e[l+3]=t*i}const o=c/4;e[o]=s?.uOffset??0,e[o+1]=s?.vOffset??0}const l={id:"subsurface",phase:"fragment",detect(c){const a=c,i=a.subsurface?.translucency;if(!i)return{f:0,f2:0};let u=t,l=0;return a.subsurface.thickness?.texture&&(u|=e),a.subsurface.thickness?.useGlTFChannel&&(l|=128),i.colorTexture&&(l|=n),i.intensityTexture&&(l|=s),(i.colorTexture?._hasTx||i.intensityTexture?._hasTx)&&(l|=r),{f:u,f2:l}},frag:c=>c._features&t?a(0!==(c._features&e),c._hasIbl,!!(128&c._features2),0!==(c._features2&n),0!==(c._features2&s),0!==(c._features2&r)):null,writeUbo(e,t,n){const s=t;s.subsurface?.translucency&&n.has("subsurfaceParams")&&i(e,s.subsurface,n)},bind(t,r,c){const a=t._material.subsurface;if(0!==(t._features&e)){const e=a?.thickness?.texture;e&&(r.push({binding:c++,resource:e.view}),r.push({binding:c++,resource:e.sampler}))}if(0!==(t._features2&n)){const e=a?.translucency?.colorTexture;e&&(r.push({binding:c++,resource:e.view}),r.push({binding:c++,resource:e.sampler}))}if(0!==(t._features2&s)){const e=a?.translucency?.intensityTexture;e&&(r.push({binding:c++,resource:e.view}),r.push({binding:c++,resource:e.sampler}))}return c},textures(e,t){const n=e.subsurface;n?.thickness?.texture&&t.push(n.thickness.texture),n?.translucency?.colorTexture&&t.push(n.translucency.colorTexture),n?.translucency?.intensityTexture&&t.push(n.translucency.intensityTexture)}};export{a as createSubsurfaceFragment,l as pbrExt,i as writeSubsurfaceUBO}; //# sourceMappingURL=subsurface-fragment-3RoX-uVJ.esm.min.js.map