@vived/component-abb-6700 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.todo.md +13 -0
- package/README.md +122 -0
- package/dist/.gitkeep +0 -0
- package/dist/Adapters/aBB6700PMAdapter.d.ts +10 -0
- package/dist/Adapters/aBB6700PMAdapter.d.ts.map +1 -0
- package/dist/Controllers/createABB6700.d.ts +12 -0
- package/dist/Controllers/createABB6700.d.ts.map +1 -0
- package/dist/Controllers/getPose.d.ts +11 -0
- package/dist/Controllers/getPose.d.ts.map +1 -0
- package/dist/Controllers/setJointAngle.d.ts +12 -0
- package/dist/Controllers/setJointAngle.d.ts.map +1 -0
- package/dist/Controllers/setPose.d.ts +11 -0
- package/dist/Controllers/setPose.d.ts.map +1 -0
- package/dist/Entities/ABB6700Entity.d.ts +35 -0
- package/dist/Entities/ABB6700Entity.d.ts.map +1 -0
- package/dist/Entities/ABB6700Repo.d.ts +32 -0
- package/dist/Entities/ABB6700Repo.d.ts.map +1 -0
- package/dist/Factory/ABB6700FeatureFactory.d.ts +26 -0
- package/dist/Factory/ABB6700FeatureFactory.d.ts.map +1 -0
- package/dist/Mocks/MockABB6700PM.d.ts +11 -0
- package/dist/Mocks/MockABB6700PM.d.ts.map +1 -0
- package/dist/Mocks/MockSetJointAngleUC.d.ts +7 -0
- package/dist/Mocks/MockSetJointAngleUC.d.ts.map +1 -0
- package/dist/Mocks/MockSetPoseUC.d.ts +7 -0
- package/dist/Mocks/MockSetPoseUC.d.ts.map +1 -0
- package/dist/PMs/ABB6700PM.d.ts +32 -0
- package/dist/PMs/ABB6700PM.d.ts.map +1 -0
- package/dist/UCs/CalcStabilizerUC.d.ts +7 -0
- package/dist/UCs/CalcStabilizerUC.d.ts.map +1 -0
- package/dist/UCs/SetJointAngleUC.d.ts +15 -0
- package/dist/UCs/SetJointAngleUC.d.ts.map +1 -0
- package/dist/UCs/SetPoseUC.d.ts +22 -0
- package/dist/UCs/SetPoseUC.d.ts.map +1 -0
- package/dist/Views/ABB6700BabylonView.d.ts +27 -0
- package/dist/Views/ABB6700BabylonView.d.ts.map +1 -0
- package/dist/abb_6700.glb +0 -0
- package/dist/abstractAudioBus-CyBWsmuN.js +14 -0
- package/dist/animationGroup-BhNThqQe.js +1454 -0
- package/dist/basisTextureLoader-BT391BsV.js +310 -0
- package/dist/brdfTextureTools-DUyKBAXf.js +79 -0
- package/dist/bumpFragment-Dd-ojPA1.js +134 -0
- package/dist/bumpFragment-KE1_PuMl.js +287 -0
- package/dist/bumpVertex-BcdvVFVx.js +8 -0
- package/dist/bumpVertexDeclaration-B5Uvs-RS.js +8 -0
- package/dist/bumpVertexDeclaration-ixSg-yGI.js +8 -0
- package/dist/clipPlaneFragment-DJwQynjA.js +136 -0
- package/dist/clipPlaneVertex-D4Wk50XG.js +376 -0
- package/dist/clipPlaneVertex-eQ147Tn2.js +350 -0
- package/dist/component.config.d.ts +17 -0
- package/dist/component.config.d.ts.map +1 -0
- package/dist/ddsTextureLoader-DeoF3iGO.js +331 -0
- package/dist/default.fragment-DKnTR9nY.js +548 -0
- package/dist/default.fragment-rIGWrUS5.js +486 -0
- package/dist/default.vertex-Bt5y1VyA.js +212 -0
- package/dist/default.vertex-Dext1liJ.js +224 -0
- package/dist/defaultUboDeclaration-BwslQZX8.js +11 -0
- package/dist/defaultUboDeclaration-DSXACgip.js +9 -0
- package/dist/easing-BAt0SO-B.js +163 -0
- package/dist/envTextureLoader-CBiW_Q-U.js +40 -0
- package/dist/exrTextureLoader-5SC6PKIA.js +740 -0
- package/dist/flowGraphApplyForceBlock-6e8-wcaw.js +32 -0
- package/dist/flowGraphApplyImpulseBlock-B27EZQow.js +32 -0
- package/dist/flowGraphArrayIndexBlock-DIUn5e4i.js +31 -0
- package/dist/flowGraphBezierCurveEasingBlock-BJmiHk40.js +25 -0
- package/dist/flowGraphBinaryOperationBlock-Bj7TANCc.js +25 -0
- package/dist/flowGraphBranchBlock-7CRvIKWc.js +19 -0
- package/dist/flowGraphCachedOperationBlock-CP1ZiuIB.js +26 -0
- package/dist/flowGraphCancelDelayBlock-DqtgzBGm.js +20 -0
- package/dist/flowGraphCodeExecutionBlock-CaYXCGqo.js +23 -0
- package/dist/flowGraphConditionalDataBlock-DJ7evX8_.js +28 -0
- package/dist/flowGraphConsoleLogBlock-cMkpqLzO.js +68 -0
- package/dist/flowGraphConstantBlock-JWybwT0A.js +28 -0
- package/dist/flowGraphContextBlock-CFDXHcbn.js +19 -0
- package/dist/flowGraphCounterBlock-B0uPkgw9.js +24 -0
- package/dist/flowGraphDataSwitchBlock-B0GSifvJ.js +27 -0
- package/dist/flowGraphDebounceBlock-CSw8zKym.js +24 -0
- package/dist/flowGraphDebugBlock-DiSR6Ahn.js +65 -0
- package/dist/flowGraphDoNBlock-C-48oQ2H.js +24 -0
- package/dist/flowGraphEasingBlock-DKUaE7Rp.js +50 -0
- package/dist/flowGraphFlipFlopBlock-DX5BGhMV.js +20 -0
- package/dist/flowGraphForLoopBlock-Di-Qwg23.js +27 -0
- package/dist/flowGraphFunctionReferenceBlock-D8X5TFsO.js +20 -0
- package/dist/flowGraphGLTFDataProvider-C4j7nPQv.js +16 -0
- package/dist/flowGraphGetAngularVelocityBlock-Cq-yTQ4D.js +31 -0
- package/dist/flowGraphGetAssetBlock-B36eioor.js +21 -0
- package/dist/flowGraphGetLinearVelocityBlock-MdrV0eUD.js +31 -0
- package/dist/flowGraphGetPhysicsMassPropertiesBlock-wXDZP1wM.js +30 -0
- package/dist/flowGraphGetPropertyBlock-eP0badwf.js +46 -0
- package/dist/flowGraphGetSoundVolumeBlock-D3gXGHXa.js +29 -0
- package/dist/flowGraphGetVariableBlock-C7-qZAec.js +31 -0
- package/dist/flowGraphIndexOfBlock-CC5l9n9P.js +31 -0
- package/dist/flowGraphInterpolationBlock-B6922jzt.js +50 -0
- package/dist/flowGraphIsKeyPressedBlock-X_iuiUOX.js +31 -0
- package/dist/flowGraphIsSoundPlayingBlock-DONQX8N8.js +29 -0
- package/dist/flowGraphJsonPointerParserBlock-DBH_gN8I.js +95 -0
- package/dist/flowGraphKeyDownEventBlock-D5T1Uyfv.js +26 -0
- package/dist/flowGraphKeyUpEventBlock-BPY_Kgkm.js +21 -0
- package/dist/flowGraphKeyboardEventBlock-C49fx3TC.js +20 -0
- package/dist/flowGraphMathBlocks-CkvrN3VJ.js +864 -0
- package/dist/flowGraphMathCombineExtractBlocks-QSjGlnoz.js +248 -0
- package/dist/flowGraphMatrixMathBlocks-B3D7Cz9p.js +117 -0
- package/dist/flowGraphMeshPickEventBlock-BBTz-taa.js +35 -0
- package/dist/flowGraphMultiGateBlock-BhY1y5BG.js +50 -0
- package/dist/flowGraphPauseAnimationBlock-CHZZXMbg.js +19 -0
- package/dist/flowGraphPauseSoundBlock-B7hMmJ0c.js +31 -0
- package/dist/flowGraphPhysicsCollisionEventBlock-CxoPpT-q.js +56 -0
- package/dist/flowGraphPlayAnimationBlock-DVAvIFux.js +99 -0
- package/dist/flowGraphPlaySoundBlock-DjHGrqbC.js +32 -0
- package/dist/flowGraphPointerDownEventBlock-qI-H0JST.js +31 -0
- package/dist/flowGraphPointerMoveEventBlock-DAi4VUyy.js +31 -0
- package/dist/flowGraphPointerOutEventBlock-CFtj68aC.js +21 -0
- package/dist/flowGraphPointerOverEventBlock-VxdHhFuu.js +23 -0
- package/dist/flowGraphPointerUpEventBlock-DRR1f07q.js +31 -0
- package/dist/flowGraphReceiveCustomEventBlock-B3bwdB66.js +52 -0
- package/dist/flowGraphSceneReadyEventBlock-Dy6lDT3j.js +23 -0
- package/dist/flowGraphSceneTickEventBlock-Bl9BF_Xw.js +32 -0
- package/dist/flowGraphSendCustomEventBlock-BAR4PGFq.js +35 -0
- package/dist/flowGraphSequenceBlock-veqU32ZZ.js +32 -0
- package/dist/flowGraphSetAngularVelocityBlock-Dj9b-zu6.js +31 -0
- package/dist/flowGraphSetDelayBlock-CMjudtvk.js +131 -0
- package/dist/flowGraphSetLinearVelocityBlock-DVDhhJBd.js +31 -0
- package/dist/flowGraphSetPhysicsMotionTypeBlock-CL3cxNCO.js +36 -0
- package/dist/flowGraphSetPropertyBlock-D3sWL3Ss.js +47 -0
- package/dist/flowGraphSetSoundVolumeBlock-CxVk45yR.js +32 -0
- package/dist/flowGraphSetVariableBlock-D1oJiwLj.js +47 -0
- package/dist/flowGraphSoundEndedEventBlock-CubEwii0.js +47 -0
- package/dist/flowGraphStopAnimationBlock-B9inwIQx.js +48 -0
- package/dist/flowGraphStopSoundBlock-BijIX2jC.js +31 -0
- package/dist/flowGraphSwitchBlock-BMhPb4OX.js +54 -0
- package/dist/flowGraphThrottleBlock-C7vrnkb1.js +37 -0
- package/dist/flowGraphTransformCoordinatesSystemBlock-DoISqaUG.js +29 -0
- package/dist/flowGraphTypeToTypeBlocks-CSML6QWx.js +57 -0
- package/dist/flowGraphUnaryOperationBlock-B0Shf-lJ.js +24 -0
- package/dist/flowGraphVectorMathBlocks-DoTRR_E0.js +178 -0
- package/dist/flowGraphWaitAllBlock-BvmDMc24.js +54 -0
- package/dist/flowGraphWhileLoopBlock-BaIq4-K2.js +27 -0
- package/dist/geometry.fragment-Bsis3UG2.js +275 -0
- package/dist/geometry.vertex-DskQ5b8j.js +222 -0
- package/dist/harmonicsFunctions-CtNrRfir.js +193 -0
- package/dist/harmonicsFunctions-PEz6APC7.js +18 -0
- package/dist/hdrTextureLoader-D9rYxJ9q.js +112 -0
- package/dist/helperFunctions-Bt7Zfkrp.js +89 -0
- package/dist/helperFunctions-CPmRxd37.js +121 -0
- package/dist/iesTextureLoader-BGUFjVhI.js +93 -0
- package/dist/index-CS3Icp_r.js +67657 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/ktxTextureLoader-cUaGg9_L.js +459 -0
- package/dist/lightFragment-BRDibDKG.js +404 -0
- package/dist/lightFragment-DCqtGMp_.js +402 -0
- package/dist/logDepthDeclaration-Bwm-3KyB.js +16 -0
- package/dist/logDepthDeclaration-gUfeSnXX.js +20 -0
- package/dist/logDepthVertex-CKeuJ6ae.js +213 -0
- package/dist/logDepthVertex-CXkmZels.js +459 -0
- package/dist/mesh.vertexData.functions-Bc9lJlrU.js +74 -0
- package/dist/oitFragment-B8zuQigp.js +792 -0
- package/dist/oitFragment-DH3h3T6x.js +657 -0
- package/dist/openpbr.fragment-BglYS6LA.js +1405 -0
- package/dist/openpbr.fragment-DrOTZs4m.js +1553 -0
- package/dist/openpbr.vertex-B-PaLFOR.js +384 -0
- package/dist/openpbr.vertex-DMdFRTnX.js +268 -0
- package/dist/openpbrMaterial-HCU0aOca.js +2880 -0
- package/dist/openpbrMaterialLoadingAdapter-CWRAa-7S.js +1122 -0
- package/dist/openpbrTransmissionLayerData-CfDVObj5.js +352 -0
- package/dist/openpbrUboDeclaration-CA2pvSbt.js +9 -0
- package/dist/openpbrUboDeclaration-xU8VOaib.js +10 -0
- package/dist/pass.fragment-1mMP54bb.js +10 -0
- package/dist/pass.fragment-DzaUp_jk.js +10 -0
- package/dist/passCube.fragment-CQaXS7g3.js +29 -0
- package/dist/passCube.fragment-QJGPwAXI.js +29 -0
- package/dist/pbr.fragment-BnaAAGxb.js +2775 -0
- package/dist/pbr.fragment-CYZk_EGU.js +2619 -0
- package/dist/pbr.vertex-CyvdCw91.js +372 -0
- package/dist/pbr.vertex-DJMAkDxs.js +270 -0
- package/dist/pbrBRDFFunctions-EugoWm6O.js +175 -0
- package/dist/pbrDebug-Bk3sPoEG.js +719 -0
- package/dist/pbrDebug-Cdalzb1I.js +614 -0
- package/dist/pbrIBLFunctions-B0bVAXCF.js +47 -0
- package/dist/pbrIBLFunctions-C06z-ouZ.js +51 -0
- package/dist/pbrMaterial-C4FCKBZQ.js +1660 -0
- package/dist/pbrMaterialLoadingAdapter-BGHlS_ZN.js +1032 -0
- package/dist/pbrUboDeclaration-1lN5_-Bw.js +9 -0
- package/dist/pbrUboDeclaration-BJOUUOZ2.js +10 -0
- package/dist/procedural.vertex-CFPKczKj.js +14 -0
- package/dist/procedural.vertex-DUW7bYZt.js +13 -0
- package/dist/rgbdDecode.fragment-CEGgE4tL.js +8 -0
- package/dist/rgbdDecode.fragment-FT0wkgah.js +8 -0
- package/dist/rgbdEncode.fragment-CLnJJf6E.js +8 -0
- package/dist/rgbdEncode.fragment-CaAcMsY9.js +8 -0
- package/dist/sceneUboDeclaration-B6oxsfcj.js +8 -0
- package/dist/sceneUboDeclaration-JByfVKik.js +13 -0
- package/dist/setupABB6700InstanceFactory.d.ts +7 -0
- package/dist/setupABB6700InstanceFactory.d.ts.map +1 -0
- package/dist/studio.env +0 -0
- package/dist/textureProcessor.fragment-BYPw6SMQ.js +152 -0
- package/dist/textureProcessor.fragment-Ciw9-F3w.js +157 -0
- package/dist/textureTools-Cct_bGgp.js +40 -0
- package/dist/tgaTextureLoader-BJOIdnFr.js +198 -0
- package/dist/thinEngine-Bt9FW4dD.js +2425 -0
- package/dist/webAudioBus-BUzRHSxr.js +88 -0
- package/dist/webAudioMainBus-Dds1TgJG.js +49 -0
- package/package.json +49 -0
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
import { b0 as e } from "./index-CS3Icp_r.js";
|
|
2
|
+
import "./logDepthDeclaration-Bwm-3KyB.js";
|
|
3
|
+
import "./oitFragment-DH3h3T6x.js";
|
|
4
|
+
const t = "pbrFragmentExtraDeclaration", v = `varying vPositionW: vec3f;
|
|
5
|
+
#if DEBUGMODE>0
|
|
6
|
+
varying vClipSpacePosition: vec4f;
|
|
7
|
+
#endif
|
|
8
|
+
#include<mainUVVaryingDeclaration>[1..7]
|
|
9
|
+
#ifdef NORMAL
|
|
10
|
+
varying vNormalW: vec3f;
|
|
11
|
+
#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)
|
|
12
|
+
varying vEnvironmentIrradiance: vec3f;
|
|
13
|
+
#endif
|
|
14
|
+
#endif
|
|
15
|
+
#if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES)
|
|
16
|
+
varying vColor: vec4f;
|
|
17
|
+
#endif
|
|
18
|
+
#if defined(CLUSTLIGHT_BATCH) && CLUSTLIGHT_BATCH>0
|
|
19
|
+
varying vViewDepth: f32;
|
|
20
|
+
#endif
|
|
21
|
+
`;
|
|
22
|
+
e.IncludesShadersStoreWGSL[t] || (e.IncludesShadersStoreWGSL[t] = v);
|
|
23
|
+
const i = "subSurfaceScatteringFunctions", g = `fn testLightingForSSS(diffusionProfile: f32)->bool
|
|
24
|
+
{return diffusionProfile<1.;}`;
|
|
25
|
+
e.IncludesShadersStoreWGSL[i] || (e.IncludesShadersStoreWGSL[i] = g);
|
|
26
|
+
const f = "importanceSampling", h = `fn hemisphereCosSample(u: vec2f)->vec3f {var phi: f32=2.*PI*u.x;var cosTheta2: f32=1.-u.y;var cosTheta: f32=sqrt(cosTheta2);var sinTheta: f32=sqrt(1.-cosTheta2);return vec3f(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}
|
|
27
|
+
fn hemisphereImportanceSampleDggx(u: vec2f,a: f32)->vec3f {var phi: f32=2.*PI*u.x;var cosTheta2: f32=(1.-u.y)/(1.+(a+1.)*((a-1.)*u.y));var cosTheta: f32=sqrt(cosTheta2);var sinTheta: f32=sqrt(1.-cosTheta2);return vec3f(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}
|
|
28
|
+
fn hemisphereImportanceSampleDggxAnisotropic(Xi: vec2f,alphaTangent: f32,alphaBitangent: f32)->vec3f
|
|
29
|
+
{let alphaT: f32=max(alphaTangent,0.0001);let alphaB: f32=max(alphaBitangent,0.0001);var phi: f32=atan(alphaB/alphaT*tan(2.0f*PI*Xi.x));if (Xi.x>0.5) {phi+=PI; }
|
|
30
|
+
let cosPhi: f32=cos(phi);let sinPhi: f32=sin(phi);let alpha2: f32=(cosPhi*cosPhi)/(alphaT*alphaT) +
|
|
31
|
+
(sinPhi*sinPhi)/(alphaB*alphaB);let tanTheta2: f32=Xi.y/(1.0f-Xi.y)/alpha2;let cosTheta: f32=1.0f/sqrt(1.0f+tanTheta2);let sinTheta: f32=sqrt(max(0.0f,1.0f-cosTheta*cosTheta));return vec3f(sinTheta*cosPhi,sinTheta*sinPhi,cosTheta);}
|
|
32
|
+
fn hemisphereImportanceSampleDCharlie(u: vec2f,a: f32)->vec3f {
|
|
33
|
+
var phi: f32=2.*PI*u.x;var sinTheta: f32=pow(u.y,a/(2.*a+1.));var cosTheta: f32=sqrt(1.-sinTheta*sinTheta);return vec3f(sinTheta*cos(phi),sinTheta*sin(phi),cosTheta);}`;
|
|
34
|
+
e.IncludesShadersStoreWGSL[f] || (e.IncludesShadersStoreWGSL[f] = h);
|
|
35
|
+
const r = "pbrHelperFunctions", p = `#define MINIMUMVARIANCE 0.0005
|
|
36
|
+
#ifndef TEXRD_DEFINED
|
|
37
|
+
fn TEXRD(t: texture_2d<f32>,ts: sampler,uv: vec2f)->vec4f {return textureSample(t,ts,uv);}
|
|
38
|
+
#define TEXRD_DEFINED
|
|
39
|
+
#endif
|
|
40
|
+
fn convertRoughnessToAverageSlope(roughness: f32)->f32
|
|
41
|
+
{return roughness*roughness+MINIMUMVARIANCE;}
|
|
42
|
+
fn fresnelGrazingReflectance(reflectance0: f32)->f32 {var reflectance90: f32=saturate(reflectance0*25.0);return reflectance90;}
|
|
43
|
+
fn getAARoughnessFactors(normalVector: vec3f)->vec2f {
|
|
44
|
+
#ifdef SPECULARAA
|
|
45
|
+
var nDfdx: vec3f=dpdx(normalVector.xyz);var nDfdy: vec3f=dpdy(normalVector.xyz);var slopeSquare: f32=max(dot(nDfdx,nDfdx),dot(nDfdy,nDfdy));var geometricRoughnessFactor: f32=pow(saturate(slopeSquare),0.333);var geometricAlphaGFactor: f32=sqrt(slopeSquare);geometricAlphaGFactor*=0.75;return vec2f(geometricRoughnessFactor,geometricAlphaGFactor);
|
|
46
|
+
#else
|
|
47
|
+
return vec2f(0.);
|
|
48
|
+
#endif
|
|
49
|
+
}
|
|
50
|
+
#ifdef ANISOTROPIC
|
|
51
|
+
#ifdef ANISOTROPIC_LEGACY
|
|
52
|
+
fn getAnisotropicRoughness(alphaG: f32,anisotropy: f32)->vec2f {var alphaT: f32=max(alphaG*(1.0+anisotropy),MINIMUMVARIANCE);var alphaB: f32=max(alphaG*(1.0-anisotropy),MINIMUMVARIANCE);return vec2f(alphaT,alphaB);}
|
|
53
|
+
fn getAnisotropicBentNormals(T: vec3f,B: vec3f,N: vec3f,V: vec3f,anisotropy: f32,roughness: f32)->vec3f {var anisotropicFrameDirection: vec3f=select(T,B,anisotropy>=0.0);var anisotropicFrameTangent: vec3f=cross(normalize(anisotropicFrameDirection),V);var anisotropicFrameNormal: vec3f=cross(anisotropicFrameTangent,anisotropicFrameDirection);var anisotropicNormal: vec3f=normalize(mix(N,anisotropicFrameNormal,abs(anisotropy)));return anisotropicNormal;}
|
|
54
|
+
#elif ANISOTROPIC_OPENPBR
|
|
55
|
+
fn getAnisotropicRoughness(alphaG: f32,anisotropy: f32)->vec2f {var alphaT: f32=max(alphaG*alphaG*sqrt(2.0/(1.0+(1.0-anisotropy)*(1.0-anisotropy))),MINIMUMVARIANCE);var alphaB: f32=max(alphaT*(1.0-anisotropy),MINIMUMVARIANCE);return vec2f(alphaT,alphaB);}
|
|
56
|
+
#else
|
|
57
|
+
fn getAnisotropicRoughness(alphaG: f32,anisotropy: f32)->vec2f {var alphaT: f32=max(mix(alphaG,1.0,anisotropy*anisotropy),MINIMUMVARIANCE);var alphaB: f32=max(alphaG,MINIMUMVARIANCE);return vec2f(alphaT,alphaB);}
|
|
58
|
+
fn getAnisotropicBentNormals(T: vec3f,B: vec3f,N: vec3f,V: vec3f,anisotropy: f32,roughness: f32)->vec3f {var bentNormal: vec3f=cross(B,V);bentNormal=normalize(cross(bentNormal,B));var sq=1.0-anisotropy*(1.0-roughness);var a: f32=sq*sq*sq*sq;bentNormal=normalize(mix(bentNormal,N,a));return bentNormal;}
|
|
59
|
+
#endif
|
|
60
|
+
#endif
|
|
61
|
+
#if defined(CLEARCOAT) || defined(SS_REFRACTION)
|
|
62
|
+
fn cocaLambertVec3(alpha: vec3f,distance: f32)->vec3f {return exp(-alpha*distance);}
|
|
63
|
+
fn cocaLambert(NdotVRefract: f32,NdotLRefract: f32,alpha: vec3f,thickness: f32)->vec3f {return cocaLambertVec3(alpha,(thickness*((NdotLRefract+NdotVRefract)/(NdotLRefract*NdotVRefract))));}
|
|
64
|
+
fn computeColorAtDistanceInMedia(color: vec3f,distance: f32)->vec3f {return -log(color)/distance;}
|
|
65
|
+
fn computeClearCoatAbsorption(NdotVRefract: f32,NdotLRefract: f32,clearCoatColor: vec3f,clearCoatThickness: f32,clearCoatIntensity: f32)->vec3f {var clearCoatAbsorption: vec3f=mix( vec3f(1.0),
|
|
66
|
+
cocaLambert(NdotVRefract,NdotLRefract,clearCoatColor,clearCoatThickness),
|
|
67
|
+
clearCoatIntensity);return clearCoatAbsorption;}
|
|
68
|
+
#endif
|
|
69
|
+
#ifdef MICROSURFACEAUTOMATIC
|
|
70
|
+
fn computeDefaultMicroSurface(microSurface: f32,reflectivityColor: vec3f)->f32
|
|
71
|
+
{const kReflectivityNoAlphaWorkflow_SmoothnessMax: f32=0.95;var reflectivityLuminance: f32=getLuminance(reflectivityColor);var reflectivityLuma: f32=sqrt(reflectivityLuminance);var resultMicroSurface=reflectivityLuma*kReflectivityNoAlphaWorkflow_SmoothnessMax;return resultMicroSurface;}
|
|
72
|
+
#endif
|
|
73
|
+
`;
|
|
74
|
+
e.IncludesShadersStoreWGSL[r] || (e.IncludesShadersStoreWGSL[r] = p);
|
|
75
|
+
const n = "pbrDirectLightingSetupFunctions", E = `struct preLightingInfo
|
|
76
|
+
{lightOffset: vec3f,
|
|
77
|
+
lightDistanceSquared: f32,
|
|
78
|
+
lightDistance: f32,
|
|
79
|
+
attenuation: f32,
|
|
80
|
+
L: vec3f,
|
|
81
|
+
H: vec3f,
|
|
82
|
+
NdotV: f32,
|
|
83
|
+
NdotLUnclamped: f32,
|
|
84
|
+
NdotL: f32,
|
|
85
|
+
VdotH: f32,
|
|
86
|
+
LdotV: f32,
|
|
87
|
+
roughness: f32,
|
|
88
|
+
diffuseRoughness: f32,
|
|
89
|
+
surfaceAlbedo: vec3f,
|
|
90
|
+
#ifdef IRIDESCENCE
|
|
91
|
+
iridescenceIntensity: f32
|
|
92
|
+
#endif
|
|
93
|
+
#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)
|
|
94
|
+
areaLightDiffuse: vec3f,
|
|
95
|
+
#ifdef SPECULARTERM
|
|
96
|
+
areaLightSpecular: vec3f,
|
|
97
|
+
areaLightFresnel: vec4f
|
|
98
|
+
#endif
|
|
99
|
+
#endif
|
|
100
|
+
};fn computePointAndSpotPreLightingInfo(lightData: vec4f,V: vec3f,N: vec3f,posW: vec3f)->preLightingInfo {var result: preLightingInfo;result.lightOffset=lightData.xyz-posW;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);result.L=normalize(result.lightOffset);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);return result;}
|
|
101
|
+
fn computeDirectionalPreLightingInfo(lightData: vec4f,V: vec3f,N: vec3f)->preLightingInfo {var result: preLightingInfo;result.lightDistance=length(-lightData.xyz);result.L=normalize(-lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);result.LdotV=dot(result.L,V);return result;}
|
|
102
|
+
fn computeHemisphericPreLightingInfo(lightData: vec4f,V: vec3f,N: vec3f)->preLightingInfo {var result: preLightingInfo;result.NdotL=dot(N,lightData.xyz)*0.5+0.5;result.NdotL=saturateEps(result.NdotL);result.NdotLUnclamped=result.NdotL;
|
|
103
|
+
#ifdef SPECULARTERM
|
|
104
|
+
result.L=normalize(lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));
|
|
105
|
+
#endif
|
|
106
|
+
return result;}
|
|
107
|
+
#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)
|
|
108
|
+
#include<ltcHelperFunctions>
|
|
109
|
+
var areaLightsLTC1SamplerSampler: sampler;var areaLightsLTC1Sampler: texture_2d<f32>;var areaLightsLTC2SamplerSampler: sampler;var areaLightsLTC2Sampler: texture_2d<f32>;fn computeAreaPreLightingInfo(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,viewDirectionW: vec3f,vNormal:vec3f,vPosition:vec3f,lightCenter:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->preLightingInfo {var result: preLightingInfo;var data: areaLightData=computeAreaLightSpecularDiffuseFresnel(ltc1,ltc1Sampler,ltc2,ltc2Sampler,viewDirectionW,vNormal,vPosition,lightCenter,halfWidth,halfHeight,roughness);
|
|
110
|
+
#ifdef SPECULARTERM
|
|
111
|
+
result.areaLightFresnel=data.Fresnel;result.areaLightSpecular=data.Specular;
|
|
112
|
+
#endif
|
|
113
|
+
result.areaLightDiffuse+=data.Diffuse;return result;}
|
|
114
|
+
fn computeAreaPreLightingInfoWithTexture(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,emissionTexture:texture_2d<f32>,emissionTextureSampler:sampler,viewDirectionW: vec3f,vNormal:vec3f,vPosition:vec3f,lightCenter:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->preLightingInfo {var result: preLightingInfo;result.lightOffset=lightCenter-vPosition;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);var data: areaLightData=computeAreaLightSpecularDiffuseFresnelWithEmission(ltc1,ltc1Sampler,ltc2,ltc2Sampler,emissionTexture,emissionTextureSampler,viewDirectionW,vNormal,vPosition,lightCenter,halfWidth,halfHeight,roughness);
|
|
115
|
+
#ifdef SPECULARTERM
|
|
116
|
+
result.areaLightFresnel=data.Fresnel;result.areaLightSpecular=data.Specular;
|
|
117
|
+
#endif
|
|
118
|
+
result.areaLightDiffuse=data.Diffuse;result.LdotV=0.;result.roughness=0.;result.diffuseRoughness=0.;result.surfaceAlbedo=vec3f(0.);return result;}
|
|
119
|
+
#endif
|
|
120
|
+
`;
|
|
121
|
+
e.IncludesShadersStoreWGSL[n] || (e.IncludesShadersStoreWGSL[n] = E);
|
|
122
|
+
const o = "pbrDirectLightingFalloffFunctions", L = `fn computeDistanceLightFalloff_Standard(lightOffset: vec3f,range: f32)->f32
|
|
123
|
+
{return max(0.,1.0-length(lightOffset)/range);}
|
|
124
|
+
fn computeDistanceLightFalloff_Physical(lightDistanceSquared: f32)->f32
|
|
125
|
+
{return 1.0/maxEps(lightDistanceSquared);}
|
|
126
|
+
fn computeDistanceLightFalloff_GLTF(lightDistanceSquared: f32,inverseSquaredRange: f32)->f32
|
|
127
|
+
{var lightDistanceFalloff: f32=1.0/maxEps(lightDistanceSquared);var factor: f32=lightDistanceSquared*inverseSquaredRange;var attenuation: f32=saturate(1.0-factor*factor);attenuation*=attenuation;lightDistanceFalloff*=attenuation;return lightDistanceFalloff;}
|
|
128
|
+
fn computeDirectionalLightFalloff_IES(lightDirection: vec3f,directionToLightCenterW: vec3f,iesLightTexture: texture_2d<f32>,iesLightTextureSampler: sampler)->f32
|
|
129
|
+
{var cosAngle: f32=dot(-lightDirection,directionToLightCenterW);var angle=acos(cosAngle)/PI;return textureSampleLevel(iesLightTexture,iesLightTextureSampler,vec2f(angle,0),0.).r;}
|
|
130
|
+
fn computeDistanceLightFalloff(lightOffset: vec3f,lightDistanceSquared: f32,range: f32,inverseSquaredRange: f32)->f32
|
|
131
|
+
{
|
|
132
|
+
#ifdef USEPHYSICALLIGHTFALLOFF
|
|
133
|
+
return computeDistanceLightFalloff_Physical(lightDistanceSquared);
|
|
134
|
+
#elif defined(USEGLTFLIGHTFALLOFF)
|
|
135
|
+
return computeDistanceLightFalloff_GLTF(lightDistanceSquared,inverseSquaredRange);
|
|
136
|
+
#else
|
|
137
|
+
return computeDistanceLightFalloff_Standard(lightOffset,range);
|
|
138
|
+
#endif
|
|
139
|
+
}
|
|
140
|
+
fn computeDirectionalLightFalloff_Standard(lightDirection: vec3f,directionToLightCenterW: vec3f,cosHalfAngle: f32,exponent: f32)->f32
|
|
141
|
+
{var falloff: f32=0.0;var cosAngle: f32=maxEps(dot(-lightDirection,directionToLightCenterW));if (cosAngle>=cosHalfAngle)
|
|
142
|
+
{falloff=max(0.,pow(cosAngle,exponent));}
|
|
143
|
+
return falloff;}
|
|
144
|
+
fn computeDirectionalLightFalloff_Physical(lightDirection: vec3f,directionToLightCenterW: vec3f,cosHalfAngle: f32)->f32
|
|
145
|
+
{const kMinusLog2ConeAngleIntensityRatio: f32=6.64385618977;
|
|
146
|
+
var concentrationKappa: f32=kMinusLog2ConeAngleIntensityRatio/(1.0-cosHalfAngle);var lightDirectionSpreadSG: vec4f= vec4f(-lightDirection*concentrationKappa,-concentrationKappa);var falloff: f32=exp2(dot( vec4f(directionToLightCenterW,1.0),lightDirectionSpreadSG));return falloff;}
|
|
147
|
+
fn computeDirectionalLightFalloff_GLTF(lightDirection: vec3f,directionToLightCenterW: vec3f,lightAngleScale: f32,lightAngleOffset: f32)->f32
|
|
148
|
+
{var cd: f32=dot(-lightDirection,directionToLightCenterW);var falloff: f32=saturate(cd*lightAngleScale+lightAngleOffset);falloff*=falloff;return falloff;}
|
|
149
|
+
fn computeDirectionalLightFalloff(lightDirection: vec3f,directionToLightCenterW: vec3f,cosHalfAngle: f32,exponent: f32,lightAngleScale: f32,lightAngleOffset: f32)->f32
|
|
150
|
+
{
|
|
151
|
+
#ifdef USEPHYSICALLIGHTFALLOFF
|
|
152
|
+
return computeDirectionalLightFalloff_Physical(lightDirection,directionToLightCenterW,cosHalfAngle);
|
|
153
|
+
#elif defined(USEGLTFLIGHTFALLOFF)
|
|
154
|
+
return computeDirectionalLightFalloff_GLTF(lightDirection,directionToLightCenterW,lightAngleScale,lightAngleOffset);
|
|
155
|
+
#else
|
|
156
|
+
return computeDirectionalLightFalloff_Standard(lightDirection,directionToLightCenterW,cosHalfAngle,exponent);
|
|
157
|
+
#endif
|
|
158
|
+
}`;
|
|
159
|
+
e.IncludesShadersStoreWGSL[o] || (e.IncludesShadersStoreWGSL[o] = L);
|
|
160
|
+
const a = "hdrFilteringFunctions", m = `#ifdef NUM_SAMPLES
|
|
161
|
+
#if NUM_SAMPLES>0
|
|
162
|
+
fn radicalInverse_VdC(value: u32)->f32
|
|
163
|
+
{var bits=(value<<16u) | (value>>16u);bits=((bits & 0x55555555u)<<1u) | ((bits & 0xAAAAAAAAu)>>1u);bits=((bits & 0x33333333u)<<2u) | ((bits & 0xCCCCCCCCu)>>2u);bits=((bits & 0x0F0F0F0Fu)<<4u) | ((bits & 0xF0F0F0F0u)>>4u);bits=((bits & 0x00FF00FFu)<<8u) | ((bits & 0xFF00FF00u)>>8u);return f32(bits)*2.3283064365386963e-10; }
|
|
164
|
+
fn hammersley(i: u32,N: u32)->vec2f
|
|
165
|
+
{return vec2f( f32(i)/ f32(N),radicalInverse_VdC(i));}
|
|
166
|
+
fn log4(x: f32)->f32 {return log2(x)/2.;}
|
|
167
|
+
fn uv_to_normal(uv: vec2f)->vec3f {var N: vec3f;var uvRange: vec2f=uv;var theta: f32=uvRange.x*2.0*PI;var phi: f32=uvRange.y*PI;N.x=cos(theta)*sin(phi);N.z=sin(theta)*sin(phi);N.y=cos(phi);return N;}
|
|
168
|
+
const NUM_SAMPLES_FLOAT: f32= f32(NUM_SAMPLES);const NUM_SAMPLES_FLOAT_INVERSED: f32=1./NUM_SAMPLES_FLOAT;const K: f32=4.;fn irradiance(
|
|
169
|
+
#ifdef CUSTOM_IRRADIANCE_FILTERING_INPUT
|
|
170
|
+
CUSTOM_IRRADIANCE_FILTERING_INPUT
|
|
171
|
+
#else
|
|
172
|
+
inputTexture: texture_cube<f32>,inputSampler: sampler,
|
|
173
|
+
#endif
|
|
174
|
+
inputN: vec3f,
|
|
175
|
+
filteringInfo: vec2f,
|
|
176
|
+
diffuseRoughness: f32,
|
|
177
|
+
surfaceAlbedo: vec3f,
|
|
178
|
+
inputV: vec3f
|
|
179
|
+
#ifdef IBL_CDF_FILTERING
|
|
180
|
+
,icdfSampler: texture_2d<f32>,icdfSamplerSampler: sampler
|
|
181
|
+
#endif
|
|
182
|
+
)->vec3f
|
|
183
|
+
{var n: vec3f=normalize(inputN);var result: vec3f= vec3f(0.0);
|
|
184
|
+
#ifndef IBL_CDF_FILTERING
|
|
185
|
+
var tangent: vec3f=select(vec3f(1.,0.,0.),vec3f(0.,0.,1.),abs(n.z)<0.999);tangent=normalize(cross(tangent,n));var bitangent: vec3f=cross(n,tangent);var tbn: mat3x3f= mat3x3f(tangent,bitangent,n);var tbnInverse: mat3x3f=transpose(tbn);
|
|
186
|
+
#endif
|
|
187
|
+
var maxLevel: f32=filteringInfo.y;var dim0: f32=filteringInfo.x;var omegaP: f32=(4.*PI)/(6.*dim0*dim0);var clampedAlbedo: vec3f=clamp(surfaceAlbedo,vec3f(0.1),vec3f(1.0));for(var i: u32=0u; i<NUM_SAMPLES; i++)
|
|
188
|
+
{var Xi: vec2f=hammersley(i,NUM_SAMPLES);
|
|
189
|
+
#ifdef IBL_CDF_FILTERING
|
|
190
|
+
var T: vec2f;T.x=textureSampleLevel(icdfSampler,icdfSamplerSampler,vec2(Xi.x,0.0),0.0).x;T.y=textureSampleLevel(icdfSampler,icdfSamplerSampler,vec2(T.x,Xi.y),0.0).y;var Ls: vec3f=uv_to_normal(vec2f(1.0-fract(T.x+0.25),T.y));var NoL: f32=dot(n,Ls);var NoV: f32=dot(n,inputV);
|
|
191
|
+
#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
|
|
192
|
+
var LoV: f32=dot(Ls,inputV);
|
|
193
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY
|
|
194
|
+
var H: vec3f=(inputV+Ls)*0.5;var VoH: f32=dot(inputV,H);
|
|
195
|
+
#endif
|
|
196
|
+
#else
|
|
197
|
+
var Ls: vec3f=hemisphereCosSample(Xi);Ls=normalize(Ls);var Ns: vec3f= vec3f(0.,0.,1.);var NoL: f32=dot(Ns,Ls);var V: vec3f=tbnInverse*inputV;var NoV: f32=dot(Ns,V);
|
|
198
|
+
#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
|
|
199
|
+
var LoV: f32=dot(Ls,V);
|
|
200
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY
|
|
201
|
+
var H: vec3f=(V+Ls)*0.5;var VoH: f32=dot(V,H);
|
|
202
|
+
#endif
|
|
203
|
+
#endif
|
|
204
|
+
if (NoL>0.) {
|
|
205
|
+
#ifdef IBL_CDF_FILTERING
|
|
206
|
+
var pdf: f32=textureSampleLevel(icdfSampler,icdfSamplerSampler,T,0.0).z;var c: vec3f=textureSampleLevel(inputTexture,inputSampler,Ls,0.0).rgb;
|
|
207
|
+
#else
|
|
208
|
+
var pdf_inversed: f32=PI/NoL;var omegaS: f32=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;var l: f32=log4(omegaS)-log4(omegaP)+log4(K);var mipLevel: f32=clamp(l,0.0,maxLevel);
|
|
209
|
+
#ifdef CUSTOM_IRRADIANCE_FILTERING_FUNCTION
|
|
210
|
+
CUSTOM_IRRADIANCE_FILTERING_FUNCTION
|
|
211
|
+
#else
|
|
212
|
+
var c: vec3f=textureSampleLevel(inputTexture,inputSampler,tbn*Ls,mipLevel).rgb;
|
|
213
|
+
#endif
|
|
214
|
+
#endif
|
|
215
|
+
#ifdef GAMMA_INPUT
|
|
216
|
+
c=toLinearSpaceVec3(c);
|
|
217
|
+
#endif
|
|
218
|
+
var diffuseRoughnessTerm: vec3f=vec3f(1.0);
|
|
219
|
+
#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
|
|
220
|
+
diffuseRoughnessTerm=diffuseBRDF_EON(clampedAlbedo,diffuseRoughness,NoL,NoV,LoV)*PI;
|
|
221
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY
|
|
222
|
+
diffuseRoughnessTerm=vec3f(diffuseBRDF_Burley(NoL,NoV,VoH,diffuseRoughness)*PI);
|
|
223
|
+
#endif
|
|
224
|
+
#ifdef IBL_CDF_FILTERING
|
|
225
|
+
var light: vec3f=vec3f(0.0);if (pdf>1e-6) {light=vec3f(1.0)/vec3f(pdf)*c;}
|
|
226
|
+
result+=NoL*diffuseRoughnessTerm*light;
|
|
227
|
+
#else
|
|
228
|
+
result+=c*diffuseRoughnessTerm;
|
|
229
|
+
#endif
|
|
230
|
+
}}
|
|
231
|
+
result=result*NUM_SAMPLES_FLOAT_INVERSED;
|
|
232
|
+
#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
|
|
233
|
+
result=result/clampedAlbedo;
|
|
234
|
+
#endif
|
|
235
|
+
return result;}
|
|
236
|
+
fn radiance(alphaG: f32,inputTexture: texture_cube<f32>,inputSampler: sampler,inputN: vec3f,filteringInfo: vec2f)->vec3f
|
|
237
|
+
{var n: vec3f=normalize(inputN);var c: vec3f=textureSampleLevel(inputTexture,inputSampler,n,0.0).rgb;
|
|
238
|
+
if (alphaG==0.) {
|
|
239
|
+
#ifdef GAMMA_INPUT
|
|
240
|
+
c=toLinearSpaceVec3(c);
|
|
241
|
+
#endif
|
|
242
|
+
return c;} else {var result: vec3f= vec3f(0.);var tangent: vec3f=select(vec3f(1.,0.,0.),vec3f(0.,0.,1.),abs(n.z)<0.999);tangent=normalize(cross(tangent,n));var bitangent: vec3f=cross(n,tangent);var tbn: mat3x3f= mat3x3f(tangent,bitangent,n);var maxLevel: f32=filteringInfo.y;var dim0: f32=filteringInfo.x;var omegaP: f32=(4.*PI)/(6.*dim0*dim0);var weight: f32=0.;for(var i: u32=0u; i<NUM_SAMPLES; i++)
|
|
243
|
+
{var Xi: vec2f=hammersley(i,NUM_SAMPLES);var H: vec3f=hemisphereImportanceSampleDggx(Xi,alphaG);var NoV: f32=1.;var NoH: f32=H.z;var NoH2: f32=H.z*H.z;var NoL: f32=2.*NoH2-1.;var L: vec3f= vec3f(2.*NoH*H.x,2.*NoH*H.y,NoL);L=normalize(L);if (NoL>0.) {var pdf_inversed: f32=4./normalDistributionFunction_TrowbridgeReitzGGX(NoH,alphaG);var omegaS: f32=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;var l: f32=log4(omegaS)-log4(omegaP)+log4(K);var mipLevel: f32=clamp( f32(l),0.0,maxLevel);weight+=NoL;var c: vec3f=textureSampleLevel(inputTexture,inputSampler,tbn*L,mipLevel).rgb;
|
|
244
|
+
#ifdef GAMMA_INPUT
|
|
245
|
+
c=toLinearSpaceVec3(c);
|
|
246
|
+
#endif
|
|
247
|
+
result+=c*NoL;}}
|
|
248
|
+
result=result/weight;return result;}}
|
|
249
|
+
#ifdef ANISOTROPIC
|
|
250
|
+
fn radianceAnisotropic(
|
|
251
|
+
alphaTangent: f32,
|
|
252
|
+
alphaBitangent: f32,
|
|
253
|
+
inputTexture: texture_cube<f32>,
|
|
254
|
+
inputSampler: sampler,
|
|
255
|
+
inputView: vec3f,
|
|
256
|
+
inputTangent: vec3f,
|
|
257
|
+
inputBitangent: vec3f,
|
|
258
|
+
inputNormal: vec3f,
|
|
259
|
+
filteringInfo: vec2f,
|
|
260
|
+
noiseInput: vec2f,
|
|
261
|
+
isRefraction: bool,
|
|
262
|
+
ior: f32
|
|
263
|
+
)->vec3f {var V: vec3f=inputView;var N: vec3f=inputNormal;var T: vec3f=inputTangent;var B: vec3f=inputBitangent;var result: vec3f=vec3f(0.f);var maxLevel: f32=filteringInfo.y;var dim0: f32=filteringInfo.x;let clampedAlphaT: f32=max(alphaTangent,MINIMUMVARIANCE);let clampedAlphaB: f32=max(alphaBitangent,MINIMUMVARIANCE);var effectiveDim: f32=dim0*sqrt(clampedAlphaT*clampedAlphaB);var omegaP: f32=(4.f*PI)/(6.f*effectiveDim*effectiveDim);let noiseScale: f32=clamp(log2(f32(NUM_SAMPLES))/12.0f,0.0f,1.0f);var weight: f32=0.f;for(var i: u32=0u; i<NUM_SAMPLES; i++)
|
|
264
|
+
{var Xi: vec2f=hammersley(i,NUM_SAMPLES);Xi=fract(Xi+noiseInput*mix(0.5f,0.015f,noiseScale));
|
|
265
|
+
var H_tangent: vec3f=hemisphereImportanceSampleDggxAnisotropic(Xi,clampedAlphaT,clampedAlphaB);var H: vec3f=normalize(H_tangent.x*T+H_tangent.y*B+H_tangent.z*N);var L: vec3f;if (isRefraction) {L=refract(-V,H,1.0/ior);} else {L=reflect(-V,H);}
|
|
266
|
+
var NoH: f32=max(dot(N,H),0.001f);var VoH: f32=max(dot(V,H),0.001f);var NoL: f32=max(dot(N,L),0.001f);if (NoL>0.f) {var pdf_inversed: f32=4./normalDistributionFunction_BurleyGGX_Anisotropic(
|
|
267
|
+
H_tangent.z,H_tangent.x,H_tangent.y,vec2f(clampedAlphaT,clampedAlphaB)
|
|
268
|
+
);var omegaS: f32=NUM_SAMPLES_FLOAT_INVERSED*pdf_inversed;var l: f32=log4(omegaS)-log4(omegaP)+log4(K);var mipLevel: f32=clamp(l,0.0f,maxLevel);weight+=NoL;var c: vec3f=textureSampleLevel(inputTexture,inputSampler,L,mipLevel).rgb;
|
|
269
|
+
#if GAMMA_INPUT
|
|
270
|
+
c=toLinearSpaceVec3(c);
|
|
271
|
+
#endif
|
|
272
|
+
result+=c*NoL;}}
|
|
273
|
+
result=result/weight;return result;}
|
|
274
|
+
#endif
|
|
275
|
+
#endif
|
|
276
|
+
#endif
|
|
277
|
+
`;
|
|
278
|
+
e.IncludesShadersStoreWGSL[a] || (e.IncludesShadersStoreWGSL[a] = m);
|
|
279
|
+
const l = "pbrBlockReflectance0", S = `var reflectanceF0: f32=reflectivityOut.reflectanceF0;var specularEnvironmentR0: vec3f=reflectivityOut.colorReflectanceF0;var specularEnvironmentR90: vec3f= reflectivityOut.reflectanceF90;
|
|
280
|
+
#ifdef ALPHAFRESNEL
|
|
281
|
+
var reflectance90: f32=fresnelGrazingReflectance(reflectanceF0);specularEnvironmentR90=specularEnvironmentR90*reflectance90;
|
|
282
|
+
#endif
|
|
283
|
+
`;
|
|
284
|
+
e.IncludesShadersStoreWGSL[l] || (e.IncludesShadersStoreWGSL[l] = S);
|
|
285
|
+
const c = "pbrDirectLightingFunctions", D = `#define CLEARCOATREFLECTANCE90 1.0
|
|
286
|
+
struct lightingInfo
|
|
287
|
+
{diffuse: vec3f,
|
|
288
|
+
#ifdef SS_TRANSLUCENCY
|
|
289
|
+
diffuseTransmission: vec3f,
|
|
290
|
+
#endif
|
|
291
|
+
#ifdef SPECULARTERM
|
|
292
|
+
specular: vec3f,
|
|
293
|
+
#endif
|
|
294
|
+
#ifdef CLEARCOAT
|
|
295
|
+
clearCoat: vec4f,
|
|
296
|
+
#endif
|
|
297
|
+
#ifdef SHEEN
|
|
298
|
+
sheen: vec3f
|
|
299
|
+
#endif
|
|
300
|
+
};fn adjustRoughnessFromLightProperties(roughness: f32,lightRadius: f32,lightDistance: f32)->f32 {
|
|
301
|
+
#if defined(USEPHYSICALLIGHTFALLOFF) || defined(USEGLTFLIGHTFALLOFF)
|
|
302
|
+
var lightRoughness: f32=lightRadius/lightDistance;var totalRoughness: f32=saturate(lightRoughness+roughness);return totalRoughness;
|
|
303
|
+
#else
|
|
304
|
+
return roughness;
|
|
305
|
+
#endif
|
|
306
|
+
}
|
|
307
|
+
fn computeHemisphericDiffuseLighting(info: preLightingInfo,lightColor: vec3f,groundColor: vec3f)->vec3f {return mix(groundColor,lightColor,info.NdotL);}
|
|
308
|
+
#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)
|
|
309
|
+
fn computeAreaDiffuseLighting(info: preLightingInfo,lightColor: vec3f)->vec3f {return info.areaLightDiffuse*lightColor;}
|
|
310
|
+
#endif
|
|
311
|
+
fn computeDiffuseLighting(info: preLightingInfo,lightColor: vec3f)->vec3f {var diffuseTerm: vec3f=vec3f(1.0/PI);
|
|
312
|
+
#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_LEGACY
|
|
313
|
+
diffuseTerm=vec3f(diffuseBRDF_Burley(info.NdotL,info.NdotV,info.VdotH,info.roughness));
|
|
314
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY
|
|
315
|
+
diffuseTerm=vec3f(diffuseBRDF_Burley(info.NdotL,info.NdotV,info.VdotH,info.diffuseRoughness));
|
|
316
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
|
|
317
|
+
var clampedAlbedo: vec3f=clamp(info.surfaceAlbedo,vec3f(0.1),vec3f(1.0));diffuseTerm=diffuseBRDF_EON(clampedAlbedo,info.diffuseRoughness,info.NdotL,info.NdotV,info.LdotV);diffuseTerm/=clampedAlbedo;
|
|
318
|
+
#endif
|
|
319
|
+
return diffuseTerm*info.attenuation*info.NdotL*lightColor;}
|
|
320
|
+
fn computeProjectionTextureDiffuseLighting(projectionLightTexture: texture_2d<f32>,projectionLightSampler: sampler,textureProjectionMatrix: mat4x4f,posW: vec3f)->vec3f{var strq: vec4f=textureProjectionMatrix* vec4f(posW,1.0);strq/=strq.w;var textureColor: vec3f=textureSample(projectionLightTexture,projectionLightSampler,strq.xy).rgb;return toLinearSpaceVec3(textureColor);}
|
|
321
|
+
#ifdef SS_TRANSLUCENCY
|
|
322
|
+
fn computeDiffuseTransmittedLighting(info: preLightingInfo,lightColor: vec3f,transmittance: vec3f)->vec3f {var transmittanceNdotL=vec3f(0.0);var NdotL: f32=absEps(info.NdotLUnclamped);
|
|
323
|
+
#ifndef SS_TRANSLUCENCY_LEGACY
|
|
324
|
+
if (info.NdotLUnclamped<0.0) {
|
|
325
|
+
#endif
|
|
326
|
+
var wrapNdotL: f32=computeWrappedDiffuseNdotL(NdotL,0.02);var trAdapt: f32=step(0.,info.NdotLUnclamped);transmittanceNdotL=mix(transmittance*wrapNdotL, vec3f(wrapNdotL),trAdapt);
|
|
327
|
+
#ifndef SS_TRANSLUCENCY_LEGACY
|
|
328
|
+
}
|
|
329
|
+
var diffuseTerm : vec3f=vec3f(1.0/PI);
|
|
330
|
+
#if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_LEGACY
|
|
331
|
+
diffuseTerm=vec3f(diffuseBRDF_Burley(
|
|
332
|
+
info.NdotL,info.NdotV,info.VdotH,info.roughness));
|
|
333
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY
|
|
334
|
+
diffuseTerm=vec3f(diffuseBRDF_Burley(
|
|
335
|
+
info.NdotL,info.NdotV,info.VdotH,info.diffuseRoughness));
|
|
336
|
+
#elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON
|
|
337
|
+
var clampedAlbedo: vec3f=clamp(info.surfaceAlbedo,vec3f(0.1),vec3f(1.0));diffuseTerm=diffuseBRDF_EON(clampedAlbedo,info.diffuseRoughness,
|
|
338
|
+
info.NdotL,info.NdotV,info.LdotV);diffuseTerm/=clampedAlbedo;
|
|
339
|
+
#endif
|
|
340
|
+
return (transmittanceNdotL*diffuseTerm)*info.attenuation*lightColor;
|
|
341
|
+
#else
|
|
342
|
+
let diffuseTerm=diffuseBRDF_Burley(NdotL,info.NdotV,info.VdotH,info.roughness);return diffuseTerm*transmittanceNdotL*info.attenuation*lightColor;
|
|
343
|
+
#endif
|
|
344
|
+
}
|
|
345
|
+
#endif
|
|
346
|
+
#ifdef SPECULARTERM
|
|
347
|
+
fn computeSpecularLighting(info: preLightingInfo,N: vec3f,reflectance0: vec3f,fresnel: vec3f,geometricRoughnessFactor: f32,lightColor: vec3f)->vec3f {var NdotH: f32=saturateEps(dot(N,info.H));var roughness: f32=max(info.roughness,geometricRoughnessFactor);var alphaG: f32=convertRoughnessToAverageSlope(roughness);var modifiedFresnel: vec3f=fresnel;
|
|
348
|
+
#ifdef IRIDESCENCE
|
|
349
|
+
modifiedFresnel=mix(fresnel,reflectance0,info.iridescenceIntensity);
|
|
350
|
+
#endif
|
|
351
|
+
var distribution: f32=normalDistributionFunction_TrowbridgeReitzGGX(NdotH,alphaG);
|
|
352
|
+
#ifdef BRDF_V_HEIGHT_CORRELATED
|
|
353
|
+
var smithVisibility: f32=smithVisibility_GGXCorrelated(info.NdotL,info.NdotV,alphaG);
|
|
354
|
+
#else
|
|
355
|
+
var smithVisibility: f32=smithVisibility_TrowbridgeReitzGGXFast(info.NdotL,info.NdotV,alphaG);
|
|
356
|
+
#endif
|
|
357
|
+
var specTerm: vec3f=modifiedFresnel*distribution*smithVisibility;return specTerm*info.attenuation*info.NdotL*lightColor;}
|
|
358
|
+
#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)
|
|
359
|
+
fn computeAreaSpecularLighting(info: preLightingInfo,specularColor: vec3f,reflectance0: vec3f,reflectance90: vec3f)->vec3f {var fresnel:vec3f =reflectance0*specularColor*info.areaLightFresnel.x+( vec3f( 1.0 )-specularColor )*info.areaLightFresnel.y*reflectance90;return specularColor*fresnel*info.areaLightSpecular;}
|
|
360
|
+
#endif
|
|
361
|
+
#endif
|
|
362
|
+
#ifdef FUZZ
|
|
363
|
+
fn evalFuzz(L: vec3f,NdotL: f32,NdotV: f32,T: vec3f,B: vec3f,ltcLut: vec3f)->f32
|
|
364
|
+
{if (NdotL<=0.0f || NdotV<=0.0f) {return 0.0f;}
|
|
365
|
+
let M=mat3x3f(
|
|
366
|
+
vec3f(ltcLut.r,0.0f,0.0f),
|
|
367
|
+
vec3f(ltcLut.g,1.0f,0.0f),
|
|
368
|
+
vec3f(0.0f,0.0f,1.0f)
|
|
369
|
+
);let Llocal: vec3f=vec3f(dot(L,T),dot(L,B),NdotL);let Lwarp: vec3f=normalize(M*Llocal);let cosThetaWarp: f32=max(Lwarp.z,0.0f);return cosThetaWarp*NdotL;}
|
|
370
|
+
#endif
|
|
371
|
+
#if defined(ANISOTROPIC) && defined(ANISOTROPIC_OPENPBR)
|
|
372
|
+
fn computeAnisotropicSpecularLighting(info: preLightingInfo,V: vec3f,N: vec3f,T: vec3f,B: vec3f,anisotropy: f32,geometricRoughnessFactor: f32,lightColor: vec3f)->vec3f {var NdotH: f32=saturateEps(dot(N,info.H));var TdotH: f32=dot(T,info.H);var BdotH: f32=dot(B,info.H);var TdotV: f32=dot(T,V);var BdotV: f32=dot(B,V);var TdotL: f32=dot(T,info.L);var BdotL: f32=dot(B,info.L);var alphaG: f32=convertRoughnessToAverageSlope(info.roughness);var alphaTB: vec2f=getAnisotropicRoughness(alphaG,anisotropy);var distribution: f32=normalDistributionFunction_BurleyGGX_Anisotropic(NdotH,TdotH,BdotH,alphaTB);var smithVisibility: f32=smithVisibility_GGXCorrelated_Anisotropic(info.NdotL,info.NdotV,TdotV,BdotV,TdotL,BdotL,alphaTB);var specTerm: vec3f=vec3f(distribution*smithVisibility);return specTerm*info.attenuation*info.NdotL*lightColor;}
|
|
373
|
+
#elif defined(ANISOTROPIC)
|
|
374
|
+
fn computeAnisotropicSpecularLighting(info: preLightingInfo,V: vec3f,N: vec3f,T: vec3f,B: vec3f,anisotropy: f32,reflectance0: vec3f,reflectance90: vec3f,geometricRoughnessFactor: f32,lightColor: vec3f)->vec3f {var NdotH: f32=saturateEps(dot(N,info.H));var TdotH: f32=dot(T,info.H);var BdotH: f32=dot(B,info.H);var TdotV: f32=dot(T,V);var BdotV: f32=dot(B,V);var TdotL: f32=dot(T,info.L);var BdotL: f32=dot(B,info.L);var alphaG: f32=convertRoughnessToAverageSlope(info.roughness);var alphaTB: vec2f=getAnisotropicRoughness(alphaG,anisotropy);alphaTB=max(alphaTB,vec2f(geometricRoughnessFactor*geometricRoughnessFactor));var fresnel: vec3f=fresnelSchlickGGXVec3(info.VdotH,reflectance0,reflectance90);
|
|
375
|
+
#ifdef IRIDESCENCE
|
|
376
|
+
fresnel=mix(fresnel,reflectance0,info.iridescenceIntensity);
|
|
377
|
+
#endif
|
|
378
|
+
var distribution: f32=normalDistributionFunction_BurleyGGX_Anisotropic(NdotH,TdotH,BdotH,alphaTB);var smithVisibility: f32=smithVisibility_GGXCorrelated_Anisotropic(info.NdotL,info.NdotV,TdotV,BdotV,TdotL,BdotL,alphaTB);var specTerm: vec3f=fresnel*distribution*smithVisibility;return specTerm*info.attenuation*info.NdotL*lightColor;}
|
|
379
|
+
#endif
|
|
380
|
+
#ifdef CLEARCOAT
|
|
381
|
+
fn computeClearCoatLighting(info: preLightingInfo,Ncc: vec3f,geometricRoughnessFactor: f32,clearCoatIntensity: f32,lightColor: vec3f)->vec4f {var NccdotL: f32=saturateEps(dot(Ncc,info.L));var NccdotH: f32=saturateEps(dot(Ncc,info.H));var clearCoatRoughness: f32=max(info.roughness,geometricRoughnessFactor);var alphaG: f32=convertRoughnessToAverageSlope(clearCoatRoughness);var fresnel: f32=fresnelSchlickGGX(info.VdotH,uniforms.vClearCoatRefractionParams.x,CLEARCOATREFLECTANCE90);fresnel*=clearCoatIntensity;var distribution: f32=normalDistributionFunction_TrowbridgeReitzGGX(NccdotH,alphaG);var kelemenVisibility: f32=visibility_Kelemen(info.VdotH);var clearCoatTerm: f32=fresnel*distribution*kelemenVisibility;return vec4f(
|
|
382
|
+
clearCoatTerm*info.attenuation*NccdotL*lightColor,
|
|
383
|
+
1.0-fresnel
|
|
384
|
+
);}
|
|
385
|
+
fn computeClearCoatLightingAbsorption(NdotVRefract: f32,L: vec3f,Ncc: vec3f,clearCoatColor: vec3f,clearCoatThickness: f32,clearCoatIntensity: f32)->vec3f {var LRefract: vec3f=-refract(L,Ncc,uniforms.vClearCoatRefractionParams.y);var NdotLRefract: f32=saturateEps(dot(Ncc,LRefract));var absorption: vec3f=computeClearCoatAbsorption(NdotVRefract,NdotLRefract,clearCoatColor,clearCoatThickness,clearCoatIntensity);return absorption;}
|
|
386
|
+
#endif
|
|
387
|
+
#ifdef SHEEN
|
|
388
|
+
fn computeSheenLighting(info: preLightingInfo,N: vec3f,reflectance0: vec3f,reflectance90: vec3f,geometricRoughnessFactor: f32,lightColor: vec3f)->vec3f {var NdotH: f32=saturateEps(dot(N,info.H));var roughness: f32=max(info.roughness,geometricRoughnessFactor);var alphaG: f32=convertRoughnessToAverageSlope(roughness);var fresnel: f32=1.;var distribution: f32=normalDistributionFunction_CharlieSheen(NdotH,alphaG);/*#ifdef SHEEN_SOFTER
|
|
389
|
+
var visibility: f32=visibility_CharlieSheen(info.NdotL,info.NdotV,alphaG);
|
|
390
|
+
#else */
|
|
391
|
+
var visibility: f32=visibility_Ashikhmin(info.NdotL,info.NdotV);/* #endif */
|
|
392
|
+
var sheenTerm: f32=fresnel*distribution*visibility;return sheenTerm*info.attenuation*info.NdotL*lightColor;}
|
|
393
|
+
#endif
|
|
394
|
+
#if defined(CLUSTLIGHT_BATCH) && CLUSTLIGHT_BATCH>0
|
|
395
|
+
#include<clusteredLightingFunctions>
|
|
396
|
+
fn computeClusteredLighting(
|
|
397
|
+
lightDataTexture: texture_2d<f32>,
|
|
398
|
+
tileMaskBuffer: ptr<storage,array<u32>>,
|
|
399
|
+
lightData: vec4f,
|
|
400
|
+
sliceRange: vec2u,
|
|
401
|
+
V: vec3f,
|
|
402
|
+
N: vec3f,
|
|
403
|
+
posW: vec3f,
|
|
404
|
+
surfaceAlbedo: vec3f,
|
|
405
|
+
reflectivityOut: reflectivityOutParams,
|
|
406
|
+
#ifdef IRIDESCENCE
|
|
407
|
+
iridescenceIntensity: f32,
|
|
408
|
+
#endif
|
|
409
|
+
#ifdef SS_TRANSLUCENCY
|
|
410
|
+
subSurfaceOut: subSurfaceOutParams,
|
|
411
|
+
#endif
|
|
412
|
+
#ifdef SPECULARTERM
|
|
413
|
+
AARoughnessFactor: f32,
|
|
414
|
+
#endif
|
|
415
|
+
#ifdef ANISOTROPIC
|
|
416
|
+
anisotropicOut: anisotropicOutParams,
|
|
417
|
+
#endif
|
|
418
|
+
#ifdef SHEEN
|
|
419
|
+
sheenOut: sheenOutParams,
|
|
420
|
+
#endif
|
|
421
|
+
#ifdef CLEARCOAT
|
|
422
|
+
clearcoatOut: clearcoatOutParams,
|
|
423
|
+
#endif
|
|
424
|
+
)->lightingInfo {let NdotV=absEps(dot(N,V));
|
|
425
|
+
#include<pbrBlockReflectance0>
|
|
426
|
+
#ifdef CLEARCOAT
|
|
427
|
+
specularEnvironmentR0=clearcoatOut.specularEnvironmentR0;
|
|
428
|
+
#endif
|
|
429
|
+
var result: lightingInfo;let tilePosition=vec2u(fragmentInputs.position.xy*lightData.xy);let maskResolution=vec2u(lightData.zw);var tileIndex=(tilePosition.x*maskResolution.x+tilePosition.y)*maskResolution.y;let batchRange=sliceRange/CLUSTLIGHT_BATCH;var batchOffset=batchRange.x*CLUSTLIGHT_BATCH;tileIndex+=batchRange.x;for (var i=batchRange.x; i<=batchRange.y; i+=1) {var mask=tileMaskBuffer[tileIndex];tileIndex+=1;let maskOffset=max(sliceRange.x,batchOffset)-batchOffset;
|
|
430
|
+
let maskWidth=min(sliceRange.y-batchOffset+1,CLUSTLIGHT_BATCH);mask=extractBits(mask,maskOffset,maskWidth);while mask != 0 {let trailing=firstTrailingBit(mask);mask ^= 1u<<trailing;let light=getClusteredLight(lightDataTexture,batchOffset+maskOffset+trailing);var preInfo=computePointAndSpotPreLightingInfo(light.vLightData,V,N,posW);preInfo.NdotV=NdotV;preInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light.vLightFalloff.x,light.vLightFalloff.y);if light.vLightDirection.w>=0.0 {preInfo.attenuation*=computeDirectionalLightFalloff(light.vLightDirection.xyz,preInfo.L,light.vLightDirection.w,light.vLightData.w,light.vLightFalloff.z,light.vLightFalloff.w);}
|
|
431
|
+
preInfo.roughness=adjustRoughnessFromLightProperties(reflectivityOut.roughness,light.vLightSpecular.a,preInfo.lightDistance);preInfo.diffuseRoughness=reflectivityOut.diffuseRoughness;preInfo.surfaceAlbedo=surfaceAlbedo;
|
|
432
|
+
#ifdef IRIDESCENCE
|
|
433
|
+
preInfo.iridescenceIntensity=iridescenceIntensity;
|
|
434
|
+
#endif
|
|
435
|
+
var info: lightingInfo;
|
|
436
|
+
#ifdef SS_TRANSLUCENCY
|
|
437
|
+
#ifdef SS_TRANSLUCENCY_LEGACY
|
|
438
|
+
info.diffuse=computeDiffuseTransmittedLighting(preInfo,light.vLightDiffuse.rgb,subSurfaceOut.transmittance);info.diffuseTransmission=vec3(0);
|
|
439
|
+
#else
|
|
440
|
+
info.diffuse=computeDiffuseLighting(preInfo,light.vLightDiffuse.rgb)*(1.0-subSurfaceOut.translucencyIntensity);info.diffuseTransmission=computeDiffuseTransmittedLighting(preInfo,light.vLightDiffuse.rgb,subSurfaceOut.transmittance);
|
|
441
|
+
#endif
|
|
442
|
+
#else
|
|
443
|
+
info.diffuse=computeDiffuseLighting(preInfo,light.vLightDiffuse.rgb);
|
|
444
|
+
#endif
|
|
445
|
+
#ifdef SPECULARTERM
|
|
446
|
+
#if CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR
|
|
447
|
+
let metalFresnel=reflectivityOut.specularWeight*getF82Specular(preInfo.VdotH,specularEnvironmentR0,reflectivityOut.colorReflectanceF90,reflectivityOut.roughness);let dielectricFresnel=fresnelSchlickGGXVec3(preInfo.VdotH,reflectivityOut.dielectricColorF0,reflectivityOut.colorReflectanceF90);let coloredFresnel=mix(dielectricFresnel,metalFresnel,reflectivityOut.metallic);
|
|
448
|
+
#else
|
|
449
|
+
let coloredFresnel=fresnelSchlickGGXVec3(preInfo.VdotH,specularEnvironmentR0,reflectivityOut.colorReflectanceF90);
|
|
450
|
+
#endif
|
|
451
|
+
#ifndef LEGACY_SPECULAR_ENERGY_CONSERVATION
|
|
452
|
+
let NdotH=dot(N,preInfo.H);let fresnel=fresnelSchlickGGXVec3(NdotH,vec3(reflectanceF0),specularEnvironmentR90);info.diffuse*=(vec3(1.0)-fresnel);
|
|
453
|
+
#endif
|
|
454
|
+
#ifdef ANISOTROPIC
|
|
455
|
+
info.specular=computeAnisotropicSpecularLighting(preInfo,V,N,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactor,light.vLightDiffuse.rgb);
|
|
456
|
+
#else
|
|
457
|
+
info.specular=computeSpecularLighting(preInfo,N,specularEnvironmentR0,coloredFresnel,AARoughnessFactor,light.vLightDiffuse.rgb);
|
|
458
|
+
#endif
|
|
459
|
+
#endif
|
|
460
|
+
#ifdef SHEEN
|
|
461
|
+
#ifdef SHEEN_LINKWITHALBEDO
|
|
462
|
+
preInfo.roughness=sheenOut.sheenIntensity;
|
|
463
|
+
#else
|
|
464
|
+
preInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light.vLightSpecular.a,preInfo.lightDistance);
|
|
465
|
+
#endif
|
|
466
|
+
info.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactor,light.vLightDiffuse.rgb);
|
|
467
|
+
#endif
|
|
468
|
+
#ifdef CLEARCOAT
|
|
469
|
+
preInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light.vLightSpecular.a,preInfo.lightDistance);info.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,light.vLightDiffuse.rgb);
|
|
470
|
+
#ifdef CLEARCOAT_TINT
|
|
471
|
+
let absorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;
|
|
472
|
+
#ifdef SS_TRANSLUCENCY
|
|
473
|
+
info.diffuseTransmission*=absorption;
|
|
474
|
+
#endif
|
|
475
|
+
#ifdef SPECULARTERM
|
|
476
|
+
info.specular*=absorption;
|
|
477
|
+
#endif
|
|
478
|
+
#endif
|
|
479
|
+
info.diffuse*=info.clearCoat.w;
|
|
480
|
+
#ifdef SS_TRANSLUCENCY
|
|
481
|
+
info.diffuseTransmission*=info.clearCoat.w;
|
|
482
|
+
#endif
|
|
483
|
+
#ifdef SPECULARTERM
|
|
484
|
+
info.specular*=info.clearCoat.w;
|
|
485
|
+
#endif
|
|
486
|
+
#ifdef SHEEN
|
|
487
|
+
info.sheen*=info.clearCoat.w;
|
|
488
|
+
#endif
|
|
489
|
+
#endif
|
|
490
|
+
result.diffuse+=info.diffuse;
|
|
491
|
+
#ifdef SS_TRANSLUCENCY
|
|
492
|
+
result.diffuseTransmission+=info.diffuseTransmission;
|
|
493
|
+
#endif
|
|
494
|
+
#ifdef SPECULARTERM
|
|
495
|
+
result.specular+=info.specular;
|
|
496
|
+
#endif
|
|
497
|
+
#ifdef CLEARCOAT
|
|
498
|
+
result.clearCoat+=info.clearCoat;
|
|
499
|
+
#endif
|
|
500
|
+
#ifdef SHEEN
|
|
501
|
+
result.sheen+=info.sheen;
|
|
502
|
+
#endif
|
|
503
|
+
}
|
|
504
|
+
batchOffset+=CLUSTLIGHT_BATCH;}
|
|
505
|
+
return result;}
|
|
506
|
+
#endif
|
|
507
|
+
`;
|
|
508
|
+
e.IncludesShadersStoreWGSL[c] || (e.IncludesShadersStoreWGSL[c] = D);
|
|
509
|
+
const s = "pbrBlockNormalGeometric", A = `var viewDirectionW: vec3f=normalize(scene.vEyePosition.xyz-input.vPositionW);
|
|
510
|
+
#ifdef NORMAL
|
|
511
|
+
var normalW: vec3f=normalize(input.vNormalW);
|
|
512
|
+
#else
|
|
513
|
+
var normalW: vec3f=normalize(cross(dpdx(input.vPositionW),dpdy(input.vPositionW)))*scene.vEyePosition.w;
|
|
514
|
+
#endif
|
|
515
|
+
var geometricNormalW: vec3f=normalW;
|
|
516
|
+
#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)
|
|
517
|
+
geometricNormalW=select(-geometricNormalW,geometricNormalW,fragmentInputs.frontFacing);
|
|
518
|
+
#endif
|
|
519
|
+
`;
|
|
520
|
+
e.IncludesShadersStoreWGSL[s] || (e.IncludesShadersStoreWGSL[s] = A);
|
|
521
|
+
const d = "pbrBlockImageProcessing", T = `#if defined(IMAGEPROCESSINGPOSTPROCESS) || defined(SS_SCATTERING)
|
|
522
|
+
#if !defined(SKIPFINALCOLORCLAMP)
|
|
523
|
+
finalColor=vec4f(clamp(finalColor.rgb,vec3f(0.),vec3f(30.0)),finalColor.a);
|
|
524
|
+
#endif
|
|
525
|
+
#else
|
|
526
|
+
finalColor=applyImageProcessing(finalColor);
|
|
527
|
+
#endif
|
|
528
|
+
finalColor=vec4f(finalColor.rgb,finalColor.a*mesh.visibility);
|
|
529
|
+
#ifdef PREMULTIPLYALPHA
|
|
530
|
+
finalColor=vec4f(finalColor.rgb*finalColor.a,finalColor.a);;
|
|
531
|
+
#endif
|
|
532
|
+
`;
|
|
533
|
+
e.IncludesShadersStoreWGSL[d] || (e.IncludesShadersStoreWGSL[d] = T);
|
|
534
|
+
const u = "pbrDebug", N = `#if DEBUGMODE>0
|
|
535
|
+
if (input.vClipSpacePosition.x/input.vClipSpacePosition.w>=uniforms.vDebugMode.x) {var color: vec3f;
|
|
536
|
+
#if DEBUGMODE==1
|
|
537
|
+
color=fragmentInputs.vPositionW.rgb;
|
|
538
|
+
#define DEBUGMODE_NORMALIZE
|
|
539
|
+
#elif DEBUGMODE==2 && defined(NORMAL)
|
|
540
|
+
color=fragmentInputs.vNormalW.rgb;
|
|
541
|
+
#define DEBUGMODE_NORMALIZE
|
|
542
|
+
#elif DEBUGMODE==3 && defined(BUMP) || DEBUGMODE==3 && defined(PARALLAX) || DEBUGMODE==3 && defined(ANISOTROPIC)
|
|
543
|
+
color=TBN[0];
|
|
544
|
+
#define DEBUGMODE_NORMALIZE
|
|
545
|
+
#elif DEBUGMODE==4 && defined(BUMP) || DEBUGMODE==4 && defined(PARALLAX) || DEBUGMODE==4 && defined(ANISOTROPIC)
|
|
546
|
+
color=TBN[1];
|
|
547
|
+
#define DEBUGMODE_NORMALIZE
|
|
548
|
+
#elif DEBUGMODE==5
|
|
549
|
+
color=normalW;
|
|
550
|
+
#define DEBUGMODE_NORMALIZE
|
|
551
|
+
#elif DEBUGMODE==6 && defined(MAINUV1)
|
|
552
|
+
color= vec3f(input.vMainUV1,0.0);
|
|
553
|
+
#elif DEBUGMODE==7 && defined(MAINUV2)
|
|
554
|
+
color= vec3f(input.vMainUV2,0.0);
|
|
555
|
+
#elif DEBUGMODE==8 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)
|
|
556
|
+
color=clearcoatOut.TBNClearCoat[0];
|
|
557
|
+
#define DEBUGMODE_NORMALIZE
|
|
558
|
+
#elif DEBUGMODE==9 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)
|
|
559
|
+
color=clearcoatOut.TBNClearCoat[1];
|
|
560
|
+
#define DEBUGMODE_NORMALIZE
|
|
561
|
+
#elif DEBUGMODE==10 && defined(CLEARCOAT)
|
|
562
|
+
color=clearcoatOut.clearCoatNormalW;
|
|
563
|
+
#define DEBUGMODE_NORMALIZE
|
|
564
|
+
#elif DEBUGMODE==11 && defined(ANISOTROPIC)
|
|
565
|
+
color=anisotropicOut.anisotropicNormal;
|
|
566
|
+
#define DEBUGMODE_NORMALIZE
|
|
567
|
+
#elif DEBUGMODE==12 && defined(ANISOTROPIC)
|
|
568
|
+
color=anisotropicOut.anisotropicTangent;
|
|
569
|
+
#define DEBUGMODE_NORMALIZE
|
|
570
|
+
#elif DEBUGMODE==13 && defined(ANISOTROPIC)
|
|
571
|
+
color=anisotropicOut.anisotropicBitangent;
|
|
572
|
+
#define DEBUGMODE_NORMALIZE
|
|
573
|
+
#elif DEBUGMODE==20 && defined(ALBEDO)
|
|
574
|
+
color=albedoTexture.rgb;
|
|
575
|
+
#ifndef GAMMAALBEDO
|
|
576
|
+
#define DEBUGMODE_GAMMA
|
|
577
|
+
#endif
|
|
578
|
+
#elif DEBUGMODE==21 && defined(AMBIENT)
|
|
579
|
+
color=aoOut.ambientOcclusionColorMap.rgb;
|
|
580
|
+
#elif DEBUGMODE==22 && defined(OPACITY)
|
|
581
|
+
color=opacityMap.rgb;
|
|
582
|
+
#elif DEBUGMODE==23 && defined(EMISSIVE)
|
|
583
|
+
color=emissiveColorTex.rgb;
|
|
584
|
+
#ifndef GAMMAEMISSIVE
|
|
585
|
+
#define DEBUGMODE_GAMMA
|
|
586
|
+
#endif
|
|
587
|
+
#elif DEBUGMODE==24 && defined(LIGHTMAP)
|
|
588
|
+
color=lightmapColor;
|
|
589
|
+
#ifndef GAMMALIGHTMAP
|
|
590
|
+
#define DEBUGMODE_GAMMA
|
|
591
|
+
#endif
|
|
592
|
+
#elif DEBUGMODE==25 && defined(REFLECTIVITY) && defined(METALLICWORKFLOW)
|
|
593
|
+
color=reflectivityOut.surfaceMetallicColorMap.rgb;
|
|
594
|
+
#elif DEBUGMODE==26 && defined(REFLECTIVITY) && !defined(METALLICWORKFLOW)
|
|
595
|
+
color=reflectivityOut.surfaceReflectivityColorMap.rgb;
|
|
596
|
+
#define DEBUGMODE_GAMMA
|
|
597
|
+
#elif DEBUGMODE==27 && defined(CLEARCOAT) && defined(CLEARCOAT_TEXTURE)
|
|
598
|
+
color= vec3f(clearcoatOut.clearCoatMapData.rg,0.0);
|
|
599
|
+
#elif DEBUGMODE==28 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)
|
|
600
|
+
color=clearcoatOut.clearCoatTintMapData.rgb;
|
|
601
|
+
#elif DEBUGMODE==29 && defined(SHEEN) && defined(SHEEN_TEXTURE)
|
|
602
|
+
color=sheenOut.sheenMapData.rgb;
|
|
603
|
+
#elif DEBUGMODE==30 && defined(ANISOTROPIC) && defined(ANISOTROPIC_TEXTURE)
|
|
604
|
+
color=anisotropicOut.anisotropyMapData.rgb;
|
|
605
|
+
#elif DEBUGMODE==31 && defined(SUBSURFACE) && defined(SS_THICKNESSANDMASK_TEXTURE)
|
|
606
|
+
color=subSurfaceOut.thicknessMap.rgb;
|
|
607
|
+
#elif DEBUGMODE==32 && defined(BUMP)
|
|
608
|
+
color=textureSample(bumpSampler,bumpSamplerSampler,fragmentInputs.vBumpUV).rgb;
|
|
609
|
+
#elif DEBUGMODE==40 && defined(SS_REFRACTION)
|
|
610
|
+
color=subSurfaceOut.environmentRefraction.rgb;
|
|
611
|
+
#define DEBUGMODE_GAMMA
|
|
612
|
+
#elif DEBUGMODE==41 && defined(REFLECTION)
|
|
613
|
+
color=reflectionOut.environmentRadiance.rgb;
|
|
614
|
+
#ifndef GAMMAREFLECTION
|
|
615
|
+
#define DEBUGMODE_GAMMA
|
|
616
|
+
#endif
|
|
617
|
+
#elif DEBUGMODE==42 && defined(CLEARCOAT) && defined(REFLECTION)
|
|
618
|
+
color=clearcoatOut.environmentClearCoatRadiance.rgb;
|
|
619
|
+
#define DEBUGMODE_GAMMA
|
|
620
|
+
#elif DEBUGMODE==50
|
|
621
|
+
color=diffuseBase.rgb;
|
|
622
|
+
#define DEBUGMODE_GAMMA
|
|
623
|
+
#elif DEBUGMODE==51 && defined(SPECULARTERM)
|
|
624
|
+
color=specularBase.rgb;
|
|
625
|
+
#define DEBUGMODE_GAMMA
|
|
626
|
+
#elif DEBUGMODE==52 && defined(CLEARCOAT)
|
|
627
|
+
color=clearCoatBase.rgb;
|
|
628
|
+
#define DEBUGMODE_GAMMA
|
|
629
|
+
#elif DEBUGMODE==53 && defined(SHEEN)
|
|
630
|
+
color=sheenBase.rgb;
|
|
631
|
+
#define DEBUGMODE_GAMMA
|
|
632
|
+
#elif DEBUGMODE==54 && defined(REFLECTION)
|
|
633
|
+
color=reflectionOut.environmentIrradiance.rgb;
|
|
634
|
+
#ifndef GAMMAREFLECTION
|
|
635
|
+
#define DEBUGMODE_GAMMA
|
|
636
|
+
#endif
|
|
637
|
+
#elif DEBUGMODE==60
|
|
638
|
+
color=surfaceAlbedo.rgb;
|
|
639
|
+
#define DEBUGMODE_GAMMA
|
|
640
|
+
#elif DEBUGMODE==61
|
|
641
|
+
color=clearcoatOut.specularEnvironmentR0;
|
|
642
|
+
#define DEBUGMODE_GAMMA
|
|
643
|
+
#elif DEBUGMODE==62 && defined(METALLICWORKFLOW)
|
|
644
|
+
color= vec3f(reflectivityOut.metallic);
|
|
645
|
+
#elif DEBUGMODE==71 && defined(METALLICWORKFLOW)
|
|
646
|
+
color=reflectivityOut.metallicF0;
|
|
647
|
+
#elif DEBUGMODE==63
|
|
648
|
+
color= vec3f(roughness);
|
|
649
|
+
#elif DEBUGMODE==64
|
|
650
|
+
color= vec3f(alphaG);
|
|
651
|
+
#elif DEBUGMODE==65
|
|
652
|
+
color= vec3f(NdotV);
|
|
653
|
+
#elif DEBUGMODE==66 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT)
|
|
654
|
+
color=clearcoatOut.clearCoatColor;
|
|
655
|
+
#define DEBUGMODE_GAMMA
|
|
656
|
+
#elif DEBUGMODE==67 && defined(CLEARCOAT)
|
|
657
|
+
color= vec3f(clearcoatOut.clearCoatRoughness);
|
|
658
|
+
#elif DEBUGMODE==68 && defined(CLEARCOAT)
|
|
659
|
+
color= vec3f(clearcoatOut.clearCoatNdotV);
|
|
660
|
+
#elif DEBUGMODE==69 && defined(SUBSURFACE) && defined(SS_TRANSLUCENCY)
|
|
661
|
+
color=subSurfaceOut.transmittance;
|
|
662
|
+
#elif DEBUGMODE==70 && defined(SUBSURFACE) && defined(SS_REFRACTION)
|
|
663
|
+
color=subSurfaceOut.refractionTransmittance;
|
|
664
|
+
#elif DEBUGMODE==72
|
|
665
|
+
color= vec3f(microSurface);
|
|
666
|
+
#elif DEBUGMODE==73
|
|
667
|
+
color=uniforms.vAlbedoColor.rgb;
|
|
668
|
+
#define DEBUGMODE_GAMMA
|
|
669
|
+
#elif DEBUGMODE==74 && !defined(METALLICWORKFLOW)
|
|
670
|
+
color=uniforms.vReflectivityColor.rgb;
|
|
671
|
+
#define DEBUGMODE_GAMMA
|
|
672
|
+
#elif DEBUGMODE==75
|
|
673
|
+
color=uniforms.vEmissiveColor;
|
|
674
|
+
#define DEBUGMODE_GAMMA
|
|
675
|
+
#elif DEBUGMODE==80 && defined(RADIANCEOCCLUSION)
|
|
676
|
+
color= vec3f(seo);
|
|
677
|
+
#elif DEBUGMODE==81 && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)
|
|
678
|
+
color= vec3f(eho);
|
|
679
|
+
#elif DEBUGMODE==82 && defined(MS_BRDF_ENERGY_CONSERVATION)
|
|
680
|
+
color= vec3f(energyConservationFactor);
|
|
681
|
+
#elif DEBUGMODE==83 && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
|
|
682
|
+
color=baseSpecularEnvironmentReflectance;
|
|
683
|
+
#define DEBUGMODE_GAMMA
|
|
684
|
+
#elif DEBUGMODE==84 && defined(CLEARCOAT) && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
|
|
685
|
+
color=clearcoatOut.clearCoatEnvironmentReflectance;
|
|
686
|
+
#define DEBUGMODE_GAMMA
|
|
687
|
+
#elif DEBUGMODE==85 && defined(SHEEN) && defined(REFLECTION)
|
|
688
|
+
color=sheenOut.sheenEnvironmentReflectance;
|
|
689
|
+
#define DEBUGMODE_GAMMA
|
|
690
|
+
#elif DEBUGMODE==86 && defined(ALPHABLEND)
|
|
691
|
+
color= vec3f(luminanceOverAlpha);
|
|
692
|
+
#elif DEBUGMODE==87
|
|
693
|
+
color= vec3f(alpha);
|
|
694
|
+
#elif DEBUGMODE==88 && defined(ALBEDO)
|
|
695
|
+
color= vec3f(albedoTexture.a);
|
|
696
|
+
#elif DEBUGMODE==89
|
|
697
|
+
color=aoOut.ambientOcclusionColor;
|
|
698
|
+
#else
|
|
699
|
+
var stripeWidth: f32=30.;var stripePos: f32=abs(floor(input.position.x/stripeWidth));var whichColor: f32=((stripePos)%(2.));var color1: vec3f= vec3f(.6,.2,.2);var color2: vec3f= vec3f(.3,.1,.1);color=mix(color1,color2,whichColor);
|
|
700
|
+
#endif
|
|
701
|
+
color*=uniforms.vDebugMode.y;
|
|
702
|
+
#ifdef DEBUGMODE_NORMALIZE
|
|
703
|
+
color=normalize(color)*0.5+0.5;
|
|
704
|
+
#endif
|
|
705
|
+
#ifdef DEBUGMODE_GAMMA
|
|
706
|
+
color=toGammaSpaceVec3(color);
|
|
707
|
+
#endif
|
|
708
|
+
fragmentOutputs.color=vec4f(color,1.0);
|
|
709
|
+
#ifdef PREPASS
|
|
710
|
+
fragmentOutputs.fragData0=toLinearSpaceVec3(color);
|
|
711
|
+
fragmentOutputs.fragData1=vec4f(0.,0.,0.,0.);
|
|
712
|
+
#endif
|
|
713
|
+
#ifdef DEBUGMODE_FORCERETURN
|
|
714
|
+
return fragmentOutputs;
|
|
715
|
+
#endif
|
|
716
|
+
}
|
|
717
|
+
#endif
|
|
718
|
+
`;
|
|
719
|
+
e.IncludesShadersStoreWGSL[u] || (e.IncludesShadersStoreWGSL[u] = N);
|