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) 4.91 kB
import{H as n,a8 as a}from"./index-B8IgtevW.esm.min.js";const o=1<<27;const t={id:"anisotropy",phase:"fragment",_anisoBrdf:"\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nfn getAnisotropicRoughness(alphaG: f32, anisotropy: f32) -> vec2<f32> {\nlet aT = max(mix(alphaG, 1.0, anisotropy * anisotropy), 0.0005);\nlet aB = max(alphaG, 0.0005);\nreturn vec2<f32>(aT, aB);\n}\nfn D_GGX_Anisotropic(NdotH: f32, TdotH: f32, BdotH: f32, alphaTB: vec2<f32>) -> f32 {\nlet a2 = alphaTB.x * alphaTB.y;\nlet v = vec3<f32>(alphaTB.y * TdotH, alphaTB.x * BdotH, a2 * NdotH);\nlet v2 = dot(v, v);\nlet w2 = a2 / v2;\nreturn a2 * w2 * w2 * RECIPROCAL_PI;\n}\nfn V_GGXCorrelated_Anisotropic(NdotL: f32, NdotV: f32, TdotV: f32, BdotV: f32, TdotL: f32, BdotL: f32, alphaTB: vec2<f32>) -> f32 {\nlet lambdaV = NdotL * length(vec3<f32>(alphaTB.x * TdotV, alphaTB.y * BdotV, NdotV));\nlet lambdaL = NdotV * length(vec3<f32>(alphaTB.x * TdotL, alphaTB.y * BdotL, NdotL));\nreturn 0.5 / (lambdaV + lambdaL);\n}\n",_anisoTB:function(n,a=!1){const o=`var anisoIntensityF = material.anisotropyParams.x;\nvar anisoDir2 = vec2<f32>(material.anisotropyParams.y, material.anisotropyParams.z);\n${a?"let anisoUV = vec2<f32>(dot(material.anisotropyUVm.xy, input.uv), dot(material.anisotropyUVm.zw, input.uv)) + material.anisotropyUVt.xy;\nlet anisoTexData = textureSample(anisotropyTexture_, anisotropySampler_, anisoUV).rgb;\nanisoIntensityF = anisoIntensityF * anisoTexData.b;\nlet anisoNdir = normalize(anisoTexData.rg * 2.0 - vec2<f32>(1.0));\nanisoDir2 = vec2<f32>(anisoDir2.x * anisoNdir.x - anisoDir2.y * anisoNdir.y, anisoDir2.y * anisoNdir.x + anisoDir2.x * anisoNdir.y);\n":""}`;return n?`${o}var anisoT = normalize(input.worldTangent);\nvar anisoB = normalize(input.worldBitangent);\n{\nlet anisoDir = normalize(anisoDir2);\nanisoT = normalize(anisoT * anisoDir.x + anisoB * anisoDir.y);\nanisoB = normalize(cross(N, anisoT));\n}`:`${o}var anisoT: vec3<f32>;\nvar anisoB: vec3<f32>;\n{\nlet aniso_Ngeom = normalize(input.worldNormal);\nlet aniso_dp1 = dpdx(input.worldPos);\nlet aniso_dp2 = dpdy(input.worldPos);\nlet aniso_duv1 = dpdx(input.uv);\nlet aniso_duv2 = dpdy(input.uv);\nlet aniso_dp2perp = cross(aniso_dp2, aniso_Ngeom);\nlet aniso_dp1perp = cross(aniso_Ngeom, aniso_dp1);\nlet aniso_tct = aniso_dp2perp * aniso_duv1.x + aniso_dp1perp * aniso_duv2.x;\nlet aniso_bct = -(aniso_dp2perp * aniso_duv1.y + aniso_dp1perp * aniso_duv2.y);\nlet aniso_det = max(dot(aniso_tct, aniso_tct), dot(aniso_bct, aniso_bct));\nlet aniso_inv = select(inverseSqrt(aniso_det), 0.0, aniso_det == 0.0);\nlet anisoTBN = mat3x3<f32>(normalize(aniso_tct * aniso_inv), normalize(aniso_bct * aniso_inv), N);\nlet anisoDir = vec3<f32>(anisoDir2.x, anisoDir2.y, 0.0);\nanisoT = normalize(anisoTBN * anisoDir);\nanisoB = normalize(cross(anisoTBN[2], anisoT));\n}`},_anisoBentNormal:"var anisoBentNormal = cross(anisoB, V);\nanisoBentNormal = normalize(cross(anisoBentNormal, anisoB));\nlet anisoSq = 1.0 - anisoIntensityF * (1.0 - roughness);\nlet anisoA = anisoSq * anisoSq * anisoSq * anisoSq;\nanisoBentNormal = normalize(mix(anisoBentNormal, N, anisoA));\nlet R_raw = reflect(-V, anisoBentNormal);",_anisoTexBit:o,detect(a){const t=a._anisotropy;return t?.isEnabled?{f:n,f2:t.texture?o:0}:{f:0,f2:0}},frag(n){if(0===(n._features2&o))return null;return{_id:"anisotropy-tex",_bindings:[{_name:"anisotropyTexture_",_type:{_kind:"texture",_textureType:"texture_2d<f32>"},_visibility:2},{_name:"anisotropySampler_",_type:{_kind:"sampler",_samplerType:"sampler"},_visibility:2}],_uboFields:[{_name:"anisotropyUVm",_type:"vec4<f32>"},{_name:"anisotropyUVt",_type:"vec4<f32>"}]}},writeUbo(n,a,o){const t=a._anisotropy;if(!t?.isEnabled||!o.has("anisotropyParams"))return;const i=o.get("anisotropyParams")/4,e=t.direction??[1,0];n[i]=t.intensity??1,n[i+1]=e[0],n[i+2]=e[1];const s=o.get("anisotropyUVm"),r=o.get("anisotropyUVt");if(void 0===s||void 0===r)return;const l=t.texture,p=l?.uScale??1,d=l?.vScale??1,_=l?.uAng??0,m=s/4,u=r/4;if(0===_)n[m]=p,n[m+1]=0,n[m+2]=0,n[m+3]=d;else{const a=Math.cos(_),o=Math.sin(_);n[m]=a*p,n[m+1]=o*d,n[m+2]=-o*p,n[m+3]=a*d}n[u]=l?.uOffset??0,n[u+1]=l?.vOffset??0,n[u+2]=0,n[u+3]=0},bind(n,a,t){const i=n._material._anisotropy;return 0!==(n._features2&o)&&i?.texture?(a.push({binding:t++,resource:i.texture.view}),a.push({binding:t++,resource:i.texture.sampler}),t):t},textures(n,a){const o=n._anisotropy;o?.texture&&a.push(o.texture)}};const i={id:"KHR_materials_anisotropy",async applyMaterial(n,o){const i=n._rawMatDef?.extensions?.KHR_materials_anisotropy;if(!i)return null;const e=i.anisotropyRotation??0,s=i.anisotropyTexture?await o._texture(i.anisotropyTexture,!1):void 0,r={};return function(n,o){n._anisotropy=o,a(t)}(r,{isEnabled:!0,intensity:i.anisotropyStrength??0,direction:[Math.cos(e),Math.sin(e)],texture:s}),r}};export{i as default}; //# sourceMappingURL=gltf-ext-anisotropy-D0bJaWrj.esm.min.js.map