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.96 kB
const n=1<<27,o="\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";function a(n,o=!1){const a=`var anisoIntensityF = material.anisotropyParams.x;\nvar anisoDir2 = vec2<f32>(material.anisotropyParams.y, material.anisotropyParams.z);\n${o?"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?`${a}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}`:`${a}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}`}const t="let aniso_alphaTB = getAnisotropicRoughness(directAlphaG, anisoIntensityF);\nlet dl_TdotH = dot(anisoT, H); let dl_BdotH = dot(anisoB, H);\nlet dl_TdotV = dot(anisoT, V); let dl_BdotV = dot(anisoB, V);\nlet dl_TdotL = dot(anisoT, L); let dl_BdotL = dot(anisoB, L);\nlet D = D_GGX_Anisotropic(NdotH, dl_TdotH, dl_BdotH, aniso_alphaTB);\nlet G = V_GGXCorrelated_Anisotropic(NdotL, NdotV, dl_TdotV, dl_BdotV, dl_TdotL, dl_BdotL, aniso_alphaTB);",i="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);",e={id:"anisotropy",phase:"fragment",detect(o){const a=o.anisotropy;return{f:0,f2:a?.isEnabled&&a.texture?n:0}},frag(o){if(0===(o._features2&n))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,o,a){const t=o.anisotropy;if(!t?.isEnabled||!a.has("anisotropyParams"))return;const i=a.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=a.get("anisotropyUVm"),r=a.get("anisotropyUVt");if(void 0===s||void 0===r)return;const l=t.texture,d=l?.uScale??1,p=l?.vScale??1,_=l?.uAng??0,m=s/4,c=r/4;if(0===_)n[m]=d,n[m+1]=0,n[m+2]=0,n[m+3]=p;else{const o=Math.cos(_),a=Math.sin(_);n[m]=o*d,n[m+1]=a*p,n[m+2]=-a*d,n[m+3]=o*p}n[c]=l?.uOffset??0,n[c+1]=l?.vOffset??0,n[c+2]=0,n[c+3]=0},bind(o,a,t){const i=o._material.anisotropy;return 0!==(o._features2&n)&&i?.texture?(a.push({binding:t++,resource:i.texture.view}),a.push({binding:t++,resource:i.texture.sampler}),t):t},textures(n,o){const a=n.anisotropy;a?.texture&&o.push(a.texture)}};export{i as ANISO_BENT_NORMAL,o as ANISO_BRDF_FUNCTIONS,t as ANISO_DIRECT_DG,n as PBR2_HAS_ANISO_TEX,a as makeAnisotropyTBBlock,e as pbrExt}; //# sourceMappingURL=anisotropy-fragment-BK9WoUeQ.esm.min.js.map