@meimu/mutracer 0.2.0 → 0.3.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.
Files changed (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
@@ -30,17 +30,17 @@ const OPENPBR_LOBE_COUNT: i32 = ${LOBE_INDICES.length};
30
30
 
31
31
 
32
32
 
33
- struct bq {
33
+ struct OpenPbrBasis {
34
34
  tangent: vec3f,
35
35
  bitangent: vec3f,
36
36
  normal: vec3f,
37
37
  };
38
38
 
39
- struct ag {
39
+ struct OpenPbrPreparedBsdf {
40
40
  material: OpenPbrResolvedMaterial,
41
- basis: bq,
41
+ basis: OpenPbrBasis,
42
42
  ${hasAnisotropyDirections ? /* wgsl */ `
43
- coatBasis: bq,
43
+ coatBasis: OpenPbrBasis,
44
44
  directionFrames: bool,
45
45
  ` : /* wgsl */ ``}
46
46
  ${hasCoatNormals ? /* wgsl */ ` coatViewLocal: vec3f,` : ''}
@@ -68,251 +68,251 @@ weights: array<f32, OPENPBR_LOBE_COUNT>,
68
68
  probabilities: array<f32, OPENPBR_LOBE_COUNT>,
69
69
  };
70
70
 
71
- fn aE(color: vec3f) -> f32 {
71
+ fn aB(color: vec3f) -> f32 {
72
72
  return dot(color, vec3f(0.212671, 0.715160, 0.072169));
73
73
  }
74
74
 
75
- fn dd(bE: f32) -> f32 {
76
- let value = (bE - 1.0) / (bE + 1.0);
75
+ fn cO(bq: f32) -> f32 {
76
+ let value = (bq - 1.0) / (bq + 1.0);
77
77
  return value * value;
78
78
  }
79
79
 
80
- fn bi(
81
- bE: f32,
80
+ fn bb(
81
+ bq: f32,
82
82
  specularWeight: f32
83
83
  ) -> f32 {
84
- let uh = min(
85
- dd(bE) * specularWeight,
84
+ let uj = min(
85
+ cO(bq) * specularWeight,
86
86
  0.9999
87
87
  );
88
- let uj = sqrt(uh);
89
- let lR = (1.0 + uj) / (1.0 - uj);
90
- return select(lR, 1.0 / lR, bE < 1.0);
88
+ let ul = sqrt(uj);
89
+ let lC = (1.0 + ul) / (1.0 - ul);
90
+ return select(lC, 1.0 / lC, bq < 1.0);
91
91
  }
92
92
 
93
- fn af(ci: f32, relativeIor: f32) -> f32 {
93
+ fn ae(ct: f32, relativeIor: f32) -> f32 {
94
94
  if (abs(relativeIor - 1.0) < 1e-6) {
95
95
  return 0.0;
96
96
  }
97
- return cC(ci, relativeIor);
97
+ return sampling_dielectric_fresnel(ct, relativeIor);
98
98
  }
99
99
 
100
- fn aG(ior: f32) -> f32 {
100
+ fn aE(ior: f32) -> f32 {
101
101
  if (ior < 1.0) {
102
102
  return 15.0 - ((1.0 / ior - 1.0) / 1.5) * 15.0;
103
103
  }
104
104
  return 16.0 + ((ior - 1.0) / 1.5) * 15.0;
105
105
  }
106
106
 
107
- fn F(tB: i32, row: i32) -> f32 {
108
- return textureLoad(openPbrEnergyLut, vec2i(tB, row), 0).r;
107
+ fn F(tC: i32, row: i32) -> f32 {
108
+ return textureLoad(openPbrEnergyLut, vec2i(tC, row), 0).r;
109
109
  }
110
110
 
111
- fn gt(
112
- dU: f32,
113
- bV: f32,
114
- im: f32
111
+ fn gd(
112
+ dH: f32,
113
+ bM: f32,
114
+ hN: f32
115
115
  ) -> f32 {
116
- let bH = clamp(dU, 0.0, 31.0);
117
- let aL = clamp(bV, 0.0, 31.0);
118
- let bD = clamp(im, 0.0, 31.0);
119
- let ef = i32(floor(bH));
120
- let aT = i32(floor(aL));
121
- let cQ = i32(floor(bD));
122
- let hU = min(ef + 1, 31);
123
- let cu = min(aT + 1, 31);
124
- let fb = min(cQ + 1, 31);
125
- let cv = bH - f32(ef);
126
- let cI = aL - f32(aT);
127
- let lj = bD - f32(cQ);
128
-
129
- let wb = F(cQ, ef * 32 + aT);
130
- let wc = F(fb, ef * 32 + aT);
131
- let wd = F(cQ, ef * 32 + cu);
132
- let wf = F(fb, ef * 32 + cu);
133
- let wg = F(cQ, hU * 32 + aT);
134
- let wh = F(fb, hU * 32 + aT);
135
- let wi = F(cQ, hU * 32 + cu);
136
- let wj = F(fb, hU * 32 + cu);
137
- let v00 = mix(wb, wg, cv);
138
- let v01 = mix(wc, wh, cv);
139
- let v10 = mix(wd, wi, cv);
140
- let v11 = mix(wf, wj, cv);
116
+ let br = clamp(dH, 0.0, 31.0);
117
+ let aK = clamp(bM, 0.0, 31.0);
118
+ let bp = clamp(hN, 0.0, 31.0);
119
+ let dP = i32(floor(br));
120
+ let aP = i32(floor(aK));
121
+ let cD = i32(floor(bp));
122
+ let hB = min(dP + 1, 31);
123
+ let ch = min(aP + 1, 31);
124
+ let eK = min(cD + 1, 31);
125
+ let ci = br - f32(dP);
126
+ let cq = aK - f32(aP);
127
+ let kR = bp - f32(cD);
128
+
129
+ let wv = F(cD, dP * 32 + aP);
130
+ let ww = F(eK, dP * 32 + aP);
131
+ let wx = F(cD, dP * 32 + ch);
132
+ let wy = F(eK, dP * 32 + ch);
133
+ let wB = F(cD, hB * 32 + aP);
134
+ let wC = F(eK, hB * 32 + aP);
135
+ let wE = F(cD, hB * 32 + ch);
136
+ let wF = F(eK, hB * 32 + ch);
137
+ let v00 = mix(wv, wB, ci);
138
+ let v01 = mix(ww, wC, ci);
139
+ let v10 = mix(wx, wE, ci);
140
+ let v11 = mix(wy, wF, ci);
141
141
  return mix(
142
- mix(v00, v10, cI),
143
- mix(v01, v11, cI),
144
- lj
142
+ mix(v00, v10, cq),
143
+ mix(v01, v11, cq),
144
+ kR
145
145
  );
146
146
  }
147
147
 
148
- fn gS(dU: f32, bV: f32) -> f32 {
149
- let bH = clamp(dU, 0.0, 31.0);
150
- let aL = clamp(bV, 0.0, 31.0);
151
- let ef = i32(floor(bH));
152
- let aT = i32(floor(aL));
153
- let hU = min(ef + 1, 31);
154
- let cu = min(aT + 1, 31);
155
- let cv = bH - f32(ef);
156
- let cI = aL - f32(aT);
157
- let v00 = F(aT, 1024 + ef);
158
- let v01 = F(cu, 1024 + ef);
159
- let v10 = F(aT, 1024 + hU);
160
- let v11 = F(cu, 1024 + hU);
148
+ fn gA(dH: f32, bM: f32) -> f32 {
149
+ let br = clamp(dH, 0.0, 31.0);
150
+ let aK = clamp(bM, 0.0, 31.0);
151
+ let dP = i32(floor(br));
152
+ let aP = i32(floor(aK));
153
+ let hB = min(dP + 1, 31);
154
+ let ch = min(aP + 1, 31);
155
+ let ci = br - f32(dP);
156
+ let cq = aK - f32(aP);
157
+ let v00 = F(aP, 1024 + dP);
158
+ let v01 = F(ch, 1024 + dP);
159
+ let v10 = F(aP, 1024 + hB);
160
+ let v11 = F(ch, 1024 + hB);
161
161
  return mix(
162
- mix(v00, v10, cv),
163
- mix(v01, v11, cv),
164
- cI
162
+ mix(v00, v10, ci),
163
+ mix(v01, v11, ci),
164
+ cq
165
165
  );
166
166
  }
167
167
 
168
168
 
169
169
 
170
- fn ev(
171
- dU: f32,
172
- bV: f32,
173
- im: f32
170
+ fn ee(
171
+ dH: f32,
172
+ bM: f32,
173
+ hN: f32
174
174
  ) -> f32 {
175
- let bH = clamp(dU, 0.0, 31.0);
176
- let aL = clamp(bV, 0.0, 31.0);
177
- let bD = clamp(im, 0.0, 31.0);
178
- let ef = i32(floor(bH));
179
- let aT = i32(floor(aL));
180
- let cQ = i32(floor(bD));
181
- let hU = min(ef + 1, 31);
182
- let cu = min(aT + 1, 31);
183
- let fb = min(cQ + 1, 31);
184
- let cv = bH - f32(ef);
185
- let cI = aL - f32(aT);
186
- let lj = bD - f32(cQ);
187
-
188
- let wb = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + aT);
189
- let wc = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + aT);
190
- let wd = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + cu);
191
- let wf = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + ef * 32 + cu);
192
- let wg = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + aT);
193
- let wh = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + aT);
194
- let wi = F(cQ, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + cu);
195
- let wj = F(fb, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hU * 32 + cu);
196
- let v00 = mix(wb, wg, cv);
197
- let v01 = mix(wc, wh, cv);
198
- let v10 = mix(wd, wi, cv);
199
- let v11 = mix(wf, wj, cv);
175
+ let br = clamp(dH, 0.0, 31.0);
176
+ let aK = clamp(bM, 0.0, 31.0);
177
+ let bp = clamp(hN, 0.0, 31.0);
178
+ let dP = i32(floor(br));
179
+ let aP = i32(floor(aK));
180
+ let cD = i32(floor(bp));
181
+ let hB = min(dP + 1, 31);
182
+ let ch = min(aP + 1, 31);
183
+ let eK = min(cD + 1, 31);
184
+ let ci = br - f32(dP);
185
+ let cq = aK - f32(aP);
186
+ let kR = bp - f32(cD);
187
+
188
+ let wv = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aP);
189
+ let ww = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aP);
190
+ let wx = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + ch);
191
+ let wy = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + ch);
192
+ let wB = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aP);
193
+ let wC = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aP);
194
+ let wE = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + ch);
195
+ let wF = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + ch);
196
+ let v00 = mix(wv, wB, ci);
197
+ let v01 = mix(ww, wC, ci);
198
+ let v10 = mix(wx, wE, ci);
199
+ let v11 = mix(wy, wF, ci);
200
200
  return mix(
201
- mix(v00, v10, cI),
202
- mix(v01, v11, cI),
203
- lj
201
+ mix(v00, v10, cq),
202
+ mix(v01, v11, cq),
203
+ kR
204
204
  );
205
205
  }
206
206
 
207
- fn eu(dU: f32, bV: f32) -> f32 {
208
- let bH = clamp(dU, 0.0, 31.0);
209
- let aL = clamp(bV, 0.0, 31.0);
210
- let ef = i32(floor(bH));
211
- let aT = i32(floor(aL));
212
- let hU = min(ef + 1, 31);
213
- let cu = min(aT + 1, 31);
214
- let cv = bH - f32(ef);
215
- let cI = aL - f32(aT);
216
- let v00 = F(aT, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + ef);
217
- let v01 = F(cu, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + ef);
218
- let v10 = F(aT, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hU);
219
- let v11 = F(cu, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hU);
207
+ fn ec(dH: f32, bM: f32) -> f32 {
208
+ let br = clamp(dH, 0.0, 31.0);
209
+ let aK = clamp(bM, 0.0, 31.0);
210
+ let dP = i32(floor(br));
211
+ let aP = i32(floor(aK));
212
+ let hB = min(dP + 1, 31);
213
+ let ch = min(aP + 1, 31);
214
+ let ci = br - f32(dP);
215
+ let cq = aK - f32(aP);
216
+ let v00 = F(aP, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
217
+ let v01 = F(ch, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
218
+ let v10 = F(aP, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
219
+ let v11 = F(ch, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
220
220
  return mix(
221
- mix(v00, v10, cv),
222
- mix(v01, v11, cv),
223
- cI
221
+ mix(v00, v10, ci),
222
+ mix(v01, v11, ci),
223
+ cq
224
224
  );
225
225
  }
226
226
 
227
- fn eR(dU: f32, bV: f32) -> f32 {
228
- let bH = clamp(dU, 0.0, 31.0);
229
- let aL = clamp(bV, 0.0, 31.0);
230
- let ef = i32(floor(bH));
231
- let aT = i32(floor(aL));
232
- let hU = min(ef + 1, 31);
233
- let cu = min(aT + 1, 31);
234
- let cv = bH - f32(ef);
235
- let cI = aL - f32(aT);
236
- let v00 = F(aT, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + ef);
237
- let v01 = F(cu, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + ef);
238
- let v10 = F(aT, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hU);
239
- let v11 = F(cu, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hU);
227
+ fn eC(dH: f32, bM: f32) -> f32 {
228
+ let br = clamp(dH, 0.0, 31.0);
229
+ let aK = clamp(bM, 0.0, 31.0);
230
+ let dP = i32(floor(br));
231
+ let aP = i32(floor(aK));
232
+ let hB = min(dP + 1, 31);
233
+ let ch = min(aP + 1, 31);
234
+ let ci = br - f32(dP);
235
+ let cq = aK - f32(aP);
236
+ let v00 = F(aP, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
237
+ let v01 = F(ch, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
238
+ let v10 = F(aP, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
239
+ let v11 = F(ch, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
240
240
  return mix(
241
- mix(v00, v10, cv),
242
- mix(v01, v11, cv),
243
- cI
241
+ mix(v00, v10, ci),
242
+ mix(v01, v11, ci),
243
+ cq
244
244
  );
245
245
  }
246
246
 
247
- fn bb(ior: f32, alpha: f32, cosine: f32) -> f32 {
248
- return ev(aG(ior), sqrt(alpha) * 31.0, cosine * 31.0);
247
+ fn aV(ior: f32, alpha: f32, cosine: f32) -> f32 {
248
+ return ee(aE(ior), sqrt(alpha) * 31.0, cosine * 31.0);
249
249
  }
250
- fn bf(ior: f32, alpha: f32) -> f32 {
251
- return eu(aG(ior), sqrt(alpha) * 31.0);
250
+ fn aY(ior: f32, alpha: f32) -> f32 {
251
+ return ec(aE(ior), sqrt(alpha) * 31.0);
252
252
  }
253
- fn ck(ior: f32, alpha: f32) -> f32 {
254
- return eR(aG(ior), sqrt(alpha) * 31.0);
253
+ fn bU(ior: f32, alpha: f32) -> f32 {
254
+ return eC(aE(ior), sqrt(alpha) * 31.0);
255
255
  }
256
256
 
257
257
 
258
258
 
259
- fn aV(alpha: f32, cosine: f32) -> f32 {
260
- let iF = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
261
- let bD = clamp(cosine * 31.0, 0.0, 31.0);
262
- let r0 = i32(floor(iF));
263
- let c0 = i32(floor(bD));
259
+ fn aR(alpha: f32, cosine: f32) -> f32 {
260
+ let ie = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
261
+ let bp = clamp(cosine * 31.0, 0.0, 31.0);
262
+ let r0 = i32(floor(ie));
263
+ let c0 = i32(floor(bp));
264
264
  let r1 = min(r0 + 1, 31);
265
265
  let c1 = min(c0 + 1, 31);
266
266
  return mix(
267
- mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bD)),
268
- mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bD)),
269
- fract(iF));
267
+ mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bp)),
268
+ mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bp)),
269
+ fract(ie));
270
270
  }
271
271
 
272
- fn cD(alpha: f32) -> f32 {
272
+ fn cl(alpha: f32) -> f32 {
273
273
  let index = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
274
274
  let i0 = i32(floor(index));
275
275
  return mix(F(i0, ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}),
276
276
  F(min(i0 + 1, 31), ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}), fract(index));
277
277
  }
278
278
 
279
- fn bd(value: f32, ior: f32) -> f32 {
279
+ fn aX(value: f32, ior: f32) -> f32 {
280
280
  if ((ior > 2.5) | (ior < 0.4)) {
281
- let vu = dd(2.5);
282
- let progress = (dd(ior) - vu) / (1.0 - vu);
281
+ let vH = cO(2.5);
282
+ let progress = (cO(ior) - vH) / (1.0 - vH);
283
283
  return (1.0 - progress) * value;
284
284
  }
285
285
  return value;
286
286
  }
287
287
 
288
- fn aw(
288
+ fn ar(
289
289
  ior: f32,
290
290
  alpha: f32,
291
291
  cosine: f32
292
292
  ) -> f32 {
293
- let value = gt(
294
- aG(ior),
293
+ let value = gd(
294
+ aE(ior),
295
295
  sqrt(alpha) * 31.0,
296
296
  cosine * 31.0
297
297
  );
298
- return bd(value, ior);
298
+ return aX(value, ior);
299
299
  }
300
300
 
301
- fn cA(ior: f32, alpha: f32) -> f32 {
302
- let value = gS(
303
- aG(ior),
301
+ fn cj(ior: f32, alpha: f32) -> f32 {
302
+ let value = gA(
303
+ aE(ior),
304
304
  sqrt(alpha) * 31.0
305
305
  );
306
- return bd(value, ior);
306
+ return aX(value, ior);
307
307
  }
308
308
 
309
- fn openpbr_to_world(basis: bq, direction: vec3f) -> vec3f {
309
+ fn openpbr_to_world(basis: OpenPbrBasis, direction: vec3f) -> vec3f {
310
310
  return direction.x * basis.tangent
311
311
  + direction.y * basis.bitangent
312
312
  + direction.z * basis.normal;
313
313
  }
314
314
 
315
- fn openpbr_to_local(basis: bq, direction: vec3f) -> vec3f {
315
+ fn openpbr_to_local(basis: OpenPbrBasis, direction: vec3f) -> vec3f {
316
316
  return vec3f(
317
317
  dot(direction, basis.tangent),
318
318
  dot(direction, basis.bitangent),
@@ -320,17 +320,17 @@ dot(direction, basis.normal)
320
320
  );
321
321
  }
322
322
 
323
- fn fD(
324
- aX: vec3f,
323
+ fn ff(
324
+ aS: vec3f,
325
325
  normal: vec3f,
326
326
  anisotropy: f32
327
- ) -> bq {
328
- var basis: bq;
327
+ ) -> OpenPbrBasis {
328
+ var basis: OpenPbrBasis;
329
329
  basis.normal = normal;
330
- var tangent = aX;
330
+ var tangent = aS;
331
331
  var bitangent = vec3f(0.0);
332
332
  if ((dot(tangent, tangent) < 0.001) | (anisotropy <= 0.0)) {
333
- aP(normal, &tangent, &bitangent);
333
+ sampling_orthonormal_basis(normal, &tangent, &bitangent);
334
334
  }
335
335
  else {
336
336
  bitangent = normalize(cross(normal, tangent));
@@ -341,153 +341,153 @@ basis.bitangent = bitangent;
341
341
  return basis;
342
342
  }
343
343
 
344
- fn kF(
345
- aB: f32,
346
- am: f32,
344
+ fn ki(
345
+ av: f32,
346
+ ai: f32,
347
347
  J: f32,
348
- ae: f32
348
+ ad: f32
349
349
  ) -> f32 {
350
- return (aB * J - am * ae)
351
- / (aB * J + am * ae);
350
+ return (av * J - ai * ad)
351
+ / (av * J + ai * ad);
352
352
  }
353
353
 
354
- fn kE(
355
- aB: f32,
356
- am: f32,
354
+ fn kh(
355
+ av: f32,
356
+ ai: f32,
357
357
  J: f32,
358
- ae: f32
358
+ ad: f32
359
359
  ) -> f32 {
360
- return (am * J - aB * ae)
361
- / (aB * ae + am * J);
360
+ return (ai * J - av * ad)
361
+ / (av * ad + ai * J);
362
362
  }
363
363
 
364
- fn ht(
365
- aB: f32,
366
- am: f32,
364
+ fn gZ(
365
+ av: f32,
366
+ ai: f32,
367
367
  J: f32,
368
- ae: f32
368
+ ad: f32
369
369
  ) -> f32 {
370
- return 2.0 * aB * J
371
- / (aB * J + am * ae);
370
+ return 2.0 * av * J
371
+ / (av * J + ai * ad);
372
372
  }
373
373
 
374
- fn hs(
375
- aB: f32,
376
- am: f32,
374
+ fn gY(
375
+ av: f32,
376
+ ai: f32,
377
377
  J: f32,
378
- ae: f32
378
+ ad: f32
379
379
  ) -> f32 {
380
- return 2.0 * aB * J
381
- / (aB * ae + am * J);
380
+ return 2.0 * av * J
381
+ / (av * ad + ai * J);
382
382
  }
383
383
 
384
- fn aY(a: vec2f, b: vec2f) -> vec2f {
384
+ fn aT(a: vec2f, b: vec2f) -> vec2f {
385
385
  return vec2f(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
386
386
  }
387
387
 
388
- fn bj(a: vec2f, b: vec2f) -> vec2f {
389
- let aq = max(dot(b, b), 1e-9);
388
+ fn bc(a: vec2f, b: vec2f) -> vec2f {
389
+ let ah = max(dot(b, b), 1e-9);
390
390
  return vec2f(
391
- (a.x * b.x + a.y * b.y) / aq,
392
- (a.y * b.x - a.x * b.y) / aq
391
+ (a.x * b.x + a.y * b.y) / ah,
392
+ (a.y * b.x - a.x * b.y) / ah
393
393
  );
394
394
  }
395
395
 
396
- fn iA(value: vec2f) -> vec2f {
397
- let gR = length(value);
398
- let uf = sqrt(max(0.0, 0.5 * (gR + value.x)));
399
- let fw = sqrt(max(0.0, 0.5 * (gR - value.x)));
400
- return vec2f(uf, select(-fw, fw, value.y >= 0.0));
396
+ fn hV(value: vec2f) -> vec2f {
397
+ let gz = length(value);
398
+ let ui = sqrt(max(0.0, 0.5 * (gz + value.x)));
399
+ let fc = sqrt(max(0.0, 0.5 * (gz - value.x)));
400
+ return vec2f(ui, select(-fc, fc, value.y >= 0.0));
401
401
  }
402
402
 
403
- fn ce(
403
+ fn bR(
404
404
  J: f32,
405
- aB: f32,
406
- am: vec2f,
407
- rM: bool
405
+ av: f32,
406
+ ai: vec2f,
407
+ rH: bool
408
408
  ) -> vec2f {
409
- let pg = sqrt(max(0.0, 1.0 - J * J));
410
- let tP = bj(vec2f(aB, 0.0), am);
411
- let hQ = tP * pg;
412
- var ae = iA(
413
- vec2f(1.0, 0.0) - aY(hQ, hQ)
409
+ let oV = sqrt(max(0.0, 1.0 - J * J));
410
+ let tR = bc(vec2f(av, 0.0), ai);
411
+ let hx = tR * oV;
412
+ var ad = hV(
413
+ vec2f(1.0, 0.0) - aT(hx, hx)
414
414
  );
415
- if (aY(am, ae).y < 0.0) {
416
- ae = -ae;
417
- }
418
-
419
- let fZ = vec2f(aB * J, 0.0);
420
- let eJ = aY(am, ae);
421
- if (rM) {
422
- let cl = am * J;
423
- let cj = ae * aB;
424
- return bj(
425
- cl - cj,
426
- cl + cj
415
+ if (aT(ai, ad).y < 0.0) {
416
+ ad = -ad;
417
+ }
418
+
419
+ let fL = vec2f(av * J, 0.0);
420
+ let eu = aT(ai, ad);
421
+ if (rH) {
422
+ let bW = ai * J;
423
+ let bT = ad * av;
424
+ return bc(
425
+ bW - bT,
426
+ bW + bT
427
427
  );
428
428
  }
429
- return bj(
430
- fZ - eJ,
431
- fZ + eJ
429
+ return bc(
430
+ fL - eu,
431
+ fL + eu
432
432
  );
433
433
  }
434
434
 
435
- fn eE(
436
- iZ: f32,
437
- ha: f32,
438
- pw: f32,
439
- nL: f32,
440
- kL: vec2f,
435
+ fn em(
436
+ iI: f32,
437
+ gJ: f32,
438
+ pk: f32,
439
+ nA: f32,
440
+ ko: vec2f,
441
441
  phase: f32
442
442
  ) -> f32 {
443
- let ol = vec2f(cos(phase), sin(phase));
444
- let iD = aY(kL, ol);
445
- let lv = iD * (ha * nL);
446
- let aq = vec2f(1.0, 0.0) - iD * pw;
447
- let hP = vec2f(iZ, 0.0)
448
- + bj(lv, aq);
449
- return dot(hP, hP);
443
+ let nZ = vec2f(cos(phase), sin(phase));
444
+ let hY = aT(ko, nZ);
445
+ let iF = hY * (gJ * nA);
446
+ let ah = vec2f(1.0, 0.0) - hY * pk;
447
+ let hw = vec2f(iI, 0.0)
448
+ + bc(iF, ah);
449
+ return dot(hw, hw);
450
450
  }
451
451
 
452
- fn au(
452
+ fn ap(
453
453
  J: f32,
454
454
  wavelength: f32,
455
- ct: f32,
456
- aR: f32,
457
- cn: f32,
458
- eG: vec2f
455
+ cf: f32,
456
+ aN: f32,
457
+ bY: f32,
458
+ ep: vec2f
459
459
  ) -> f32 {
460
- let dF = clamp(abs(J), 1e-5, 1.0);
461
- let hI = pow(aR / cn, 2.0)
462
- * (1.0 - dF * dF);
463
- if (hI >= 1.0) {
460
+ let dd = clamp(abs(J), 1e-5, 1.0);
461
+ let hp = pow(aN / bY, 2.0)
462
+ * (1.0 - dd * dd);
463
+ if (hp >= 1.0) {
464
464
  return 1.0;
465
465
  }
466
- let dc = sqrt(1.0 - hI);
467
- let lL = kF(
468
- aR, cn, dF, dc
466
+ let cN = sqrt(1.0 - hp);
467
+ let lq = ki(
468
+ aN, bY, dd, cN
469
469
  );
470
- let lK = kE(
471
- aR, cn, dF, dc
470
+ let lp = kh(
471
+ aN, bY, dd, cN
472
472
  );
473
- let jG = ht(
474
- aR, cn, dF, dc
473
+ let jm = gZ(
474
+ aN, bY, dd, cN
475
475
  );
476
- let jF = hs(
477
- aR, cn, dF, dc
476
+ let jl = gY(
477
+ aN, bY, dd, cN
478
478
  );
479
- let gG = cn * dc
480
- / max(aR * dF, 1e-9);
481
- let phase = 2.0 * PI * (2.0 * cn * ct * dc) / wavelength;
479
+ let gp = bY * cN
480
+ / max(aN * dd, 1e-9);
481
+ let phase = 2.0 * PI * (2.0 * bY * cf * cN) / wavelength;
482
482
  var reflectance = 0.0;
483
483
 
484
- for (var kJ = 0u; kJ < (rtUniform.loopUnrollGuard >> 1u); kJ++) {
485
- let iZ = select(lL, lK, kJ == 1u);
486
- let ha = select(jG, jF, kJ == 1u);
487
- let kL = ce(
488
- dc, cn, eG, kJ == 1u);
489
- reflectance += eE(iZ, ha,
490
- -iZ, ha * gG, kL, phase);
484
+ for (var kn = 0u; kn < (rtUniform.loopUnrollGuard >> 1u); kn++) {
485
+ let iI = select(lq, lp, kn == 1u);
486
+ let gJ = select(jm, jl, kn == 1u);
487
+ let ko = bR(
488
+ cN, bY, ep, kn == 1u);
489
+ reflectance += em(iI, gJ,
490
+ -iI, gJ * gp, ko, phase);
491
491
  }
492
492
  return clamp(0.5 * reflectance, 0.0, 1.0);
493
493
  }
@@ -495,44 +495,44 @@ return clamp(0.5 * reflectance, 0.0, 1.0);
495
495
 
496
496
 
497
497
 
498
- fn cw(cosine: f32, f0: vec3f, tint: vec3f) -> vec3f {
499
- let sr = mix(f0, vec3f(1.0), aI(cosine));
500
- if (all(tint == vec3f(1.0))) { return sr; }
501
- let dD = 1.0 / 7.0;
502
- let mY = 1.0 - dD;
503
- let fX = mix(f0, vec3f(1.0), aI(dD));
504
- let dw = 1.0 - cosine;
505
- let ru = cosine * aI(cosine) * dw
506
- / (dD * pow(mY, 6.0));
507
- return clamp(sr - ru * (fX - tint * fX), vec3f(0.0), vec3f(1.0));
498
+ fn openpbr_metal_fresnel(cosine: f32, f0: vec3f, tint: vec3f) -> vec3f {
499
+ let sl = mix(f0, vec3f(1.0), aH(cosine));
500
+ if (all(tint == vec3f(1.0))) { return sl; }
501
+ let da = 1.0 / 7.0;
502
+ let mK = 1.0 - da;
503
+ let fJ = mix(f0, vec3f(1.0), aH(da));
504
+ let cY = 1.0 - cosine;
505
+ let rp = cosine * aH(cosine) * cY
506
+ / (da * pow(mK, 6.0));
507
+ return clamp(sl - rp * (fJ - tint * fJ), vec3f(0.0), vec3f(1.0));
508
508
  }
509
509
 
510
- fn cX(f0: f32, uN: f32) -> vec2f {
511
- let dY = clamp(f0, 0.0, 0.99);
512
- let gZ = sqrt(dY);
513
- let rK = (1.0 - dY) / (1.0 + dY);
514
- let rH = (1.0 + gZ) / max(1.0 - gZ, 1e-9);
515
- let ior = mix(rH, rK, clamp(uN, 0.0, 1.0));
516
- let kp = (
517
- (ior + 1.0) * (ior + 1.0) * dY
510
+ fn cJ(f0: f32, uS: f32) -> vec2f {
511
+ let dL = clamp(f0, 0.0, 0.99);
512
+ let gI = sqrt(dL);
513
+ let rF = (1.0 - dL) / (1.0 + dL);
514
+ let rC = (1.0 + gI) / max(1.0 - gI, 1e-9);
515
+ let ior = mix(rC, rF, clamp(uS, 0.0, 1.0));
516
+ let jT = (
517
+ (ior + 1.0) * (ior + 1.0) * dL
518
518
  - (ior - 1.0) * (ior - 1.0)
519
- ) / max(1.0 - dY, 1e-9);
520
- return vec2f(ior, sqrt(max(kp, 0.0)));
519
+ ) / max(1.0 - dL, 1e-9);
520
+ return vec2f(ior, sqrt(max(jT, 0.0)));
521
521
  }
522
522
 
523
523
 
524
- fn bS(ct: f32, weight: f32) -> f32 {
525
- return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, ct);
524
+ fn bJ(cf: f32, weight: f32) -> f32 {
525
+ return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, cf);
526
526
  }
527
527
 
528
528
 
529
529
 
530
- fn bJ(
530
+ fn bw(
531
531
  material: OpenPbrResolvedMaterial,
532
532
  color: vec3f,
533
533
  viewLocal: vec3f,
534
534
  lightLocal: vec3f,
535
- fJ: f32,
535
+ fl: f32,
536
536
  pdf: ptr<function, f32>
537
537
  ) -> vec3f {
538
538
  *pdf = 0.0;
@@ -541,26 +541,26 @@ return vec3f(0.0);
541
541
  }
542
542
 
543
543
  let roughness = material.diffuseRoughness;
544
- let hl = 0.5 - 2.0 / (3.0 * PI);
545
- let pc = 2.0 / 3.0 - 28.0 / (15.0 * PI);
546
- let pp = lightLocal.z;
547
- let nt = viewLocal.z;
548
- let directional = dot(lightLocal, viewLocal) - pp * nt;
549
- let hh = select(
544
+ let gS = 0.5 - 2.0 / (3.0 * PI);
545
+ let oR = 2.0 / 3.0 - 28.0 / (15.0 * PI);
546
+ let pe = lightLocal.z;
547
+ let nd = viewLocal.z;
548
+ let directional = dot(lightLocal, viewLocal) - pe * nd;
549
+ let gP = select(
550
550
  directional,
551
- directional / max(max(pp, nt), 1e-7),
551
+ directional / max(max(pe, nd), 1e-7),
552
552
  directional > 0.0
553
553
  );
554
- let iJ = 1.0 / (1.0 + hl * roughness);
555
- let ot = color * INVPI * iJ
556
- * (1.0 + roughness * hh);
557
-
558
- let dr = 1.0 - pp;
559
- let outputComplement = 1.0 - nt;
560
- let ph = dr * (
561
- 0.0571085289 + dr * (
562
- 0.491881867 + dr * (
563
- -0.332181442 + dr * 0.0714429953
554
+ let il = 1.0 / (1.0 + gS * roughness);
555
+ let oe = color * INVPI * il
556
+ * (1.0 + roughness * gP);
557
+
558
+ let cW = 1.0 - pe;
559
+ let outputComplement = 1.0 - nd;
560
+ let oW = cW * (
561
+ 0.0571085289 + cW * (
562
+ 0.491881867 + cW * (
563
+ -0.332181442 + cW * 0.0714429953
564
564
  )
565
565
  )
566
566
  );
@@ -571,22 +571,22 @@ let outputGOverPi = outputComplement * (
571
571
  )
572
572
  )
573
573
  );
574
- let qr = (1.0 + roughness * ph)
575
- / (1.0 + hl * roughness);
574
+ let qj = (1.0 + roughness * oW)
575
+ / (1.0 + gS * roughness);
576
576
  let outputAlbedo = (1.0 + roughness * outputGOverPi)
577
- / (1.0 + hl * roughness);
578
- let gi = iJ * (1.0 + pc * roughness);
579
- let hV = color * color * gi
580
- / max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - gi));
581
- let mn = hV * INVPI
577
+ / (1.0 + gS * roughness);
578
+ let fU = il * (1.0 + oR * roughness);
579
+ let hC = color * color * fU
580
+ / max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - fU));
581
+ let lT = hC * INVPI
582
582
  * max(1e-7, 1.0 - outputAlbedo)
583
- * max(1e-7, 1.0 - qr)
584
- / max(1e-7, 1.0 - gi);
583
+ * max(1e-7, 1.0 - qj)
584
+ / max(1e-7, 1.0 - fU);
585
585
  *pdf = lightLocal.z * INVPI;
586
- return (ot + mn) * fJ;
586
+ return (oe + lT) * fl;
587
587
  }
588
588
 
589
- fn aU(viewCosine: f32, roughness: f32) -> f32 {
589
+ fn aQ(viewCosine: f32, roughness: f32) -> f32 {
590
590
  let x = clamp(viewCosine, 0.0, 1.0);
591
591
  let y = clamp(roughness, 0.01, 1.0);
592
592
  let scale = y * (0.0206607 + 1.58491 * y)
@@ -600,7 +600,7 @@ let gaussian = exp(-0.5 * pow((x - mean) / scale, 2.0))
600
600
  return max(gaussian + offset, 0.0);
601
601
  }
602
602
 
603
- fn kD(
603
+ fn kg(
604
604
  material: OpenPbrResolvedMaterial,
605
605
  viewLocal: vec3f,
606
606
  lightLocal: vec3f,
@@ -610,7 +610,7 @@ pdf: ptr<function, f32>
610
610
  if ((viewLocal.z <= 0.0) | (lightLocal.z <= 0.0)) {
611
611
  return vec3f(0.0);
612
612
  }
613
- let albedo = aU(
613
+ let albedo = aQ(
614
614
  viewLocal.z,
615
615
  material.fuzzRoughness
616
616
  );
@@ -618,12 +618,12 @@ material.fuzzRoughness
618
618
  return material.fuzzColor * albedo * INVPI;
619
619
  }
620
620
 
621
- fn ao(
621
+ fn aj(
622
622
  material: OpenPbrResolvedMaterial,
623
623
  viewLocal: vec3f,
624
624
  lightLocal: vec3f,
625
- ad: vec3f,
626
- bG: vec3f,
625
+ aa: vec3f,
626
+ fresnel: vec3f,
627
627
  pdf: ptr<function, f32>
628
628
  ) -> vec3f {
629
629
  *pdf = 0.0;
@@ -632,24 +632,24 @@ return vec3f(0.0);
632
632
  }
633
633
 
634
634
  let alpha = vec2f(material.alphaX, material.alphaY);
635
- let distribution = cW(ad, alpha);
636
- let kz = aF(viewLocal, alpha);
637
- let ep = kz
638
- * aF(lightLocal, alpha);
635
+ let distribution = sampling_ggx_ndf(aa, alpha);
636
+ let kc = aD(viewLocal, alpha);
637
+ let dY = kc
638
+ * aD(lightLocal, alpha);
639
639
 
640
- *pdf = kz * distribution / (4.0 * max(viewLocal.z, 1e-8));
641
- return bG * distribution * ep
640
+ *pdf = kc * distribution / (4.0 * max(viewLocal.z, 1e-8));
641
+ return fresnel * distribution * dY
642
642
  / (4.0 * max(lightLocal.z * viewLocal.z, 1e-8));
643
643
  }
644
644
 
645
- fn dE(
645
+ fn dc(
646
646
  material: OpenPbrResolvedMaterial,
647
647
  relativeIor: f32,
648
648
  tint: vec3f,
649
649
  viewLocal: vec3f,
650
650
  lightLocal: vec3f,
651
- ad: vec3f,
652
- bG: vec3f,
651
+ aa: vec3f,
652
+ fresnel: vec3f,
653
653
  pdf: ptr<function, f32>
654
654
  ) -> vec3f {
655
655
  *pdf = 0.0;
@@ -657,74 +657,74 @@ if (lightLocal.z >= 0.0) {
657
657
  return vec3f(0.0);
658
658
  }
659
659
 
660
- let ls = dot(lightLocal, ad);
661
- let bm = dot(viewLocal, ad);
660
+ let lightHalf = dot(lightLocal, aa);
661
+ let viewHalf = dot(viewLocal, aa);
662
662
 
663
663
 
664
- if ((bm <= 0.0) | (ls >= 0.0)) {
664
+ if ((viewHalf <= 0.0) | (lightHalf >= 0.0)) {
665
665
  return vec3f(0.0);
666
666
  }
667
667
  let alpha = vec2f(material.alphaX, material.alphaY);
668
- let distribution = cW(ad, alpha);
669
- let kz = aF(viewLocal, alpha);
670
- let ep = kz
671
- * aF(lightLocal, alpha);
672
- var aq = ls + bm * relativeIor;
673
- aq *= aq;
674
- let qw = abs(ls) / max(aq, 1e-8);
675
- let jU = relativeIor * relativeIor;
676
-
677
- *pdf = kz * max(0.0, bm) * distribution * qw
668
+ let distribution = sampling_ggx_ndf(aa, alpha);
669
+ let kc = aD(viewLocal, alpha);
670
+ let dY = kc
671
+ * aD(lightLocal, alpha);
672
+ var ah = lightHalf + viewHalf * relativeIor;
673
+ ah *= ah;
674
+ let qo = abs(lightHalf) / max(ah, 1e-8);
675
+ let jB = relativeIor * relativeIor;
676
+
677
+ *pdf = kc * max(0.0, viewHalf) * distribution * qo
678
678
  / max(viewLocal.z, 1e-8);
679
- return tint * (vec3f(1.0) - bG) * distribution * ep
680
- * abs(bm) * qw * jU
679
+ return tint * (vec3f(1.0) - fresnel) * distribution * dY
680
+ * abs(viewHalf) * qo * jB
681
681
  / max(abs(lightLocal.z * viewLocal.z), 1e-8);
682
682
  }
683
683
 
684
- fn bh(material: OpenPbrResolvedMaterial) -> vec3f {
684
+ fn ba(material: OpenPbrResolvedMaterial) -> vec3f {
685
685
  if (HAS_MEDIUM & (material.mediumType > 0)) {
686
686
  return vec3f(1.0);
687
687
  }
688
688
  return material.transmissionColor;
689
689
  }
690
690
 
691
- fn cZ(ai: f32) -> f32 {
692
- return 2.0 * ai / (1.0 + ai);
691
+ fn cL(ag: f32) -> f32 {
692
+ return 2.0 * ag / (1.0 + ag);
693
693
  }
694
694
 
695
- fn av(
696
- ai: vec3f,
695
+ fn aq(
696
+ ag: vec3f,
697
697
  transmissionWeight: f32
698
698
  ) -> vec3f {
699
- let gA = 2.0 * ai
700
- / (vec3f(1.0) + ai);
699
+ let gk = 2.0 * ag
700
+ / (vec3f(1.0) + ag);
701
701
  return mix(
702
- ai,
703
- gA,
702
+ ag,
703
+ gk,
704
704
  clamp(transmissionWeight, 0.0, 1.0)
705
705
  );
706
706
  }
707
707
 
708
- fn bN(
708
+ fn bF(
709
709
  material: OpenPbrResolvedMaterial,
710
710
  J: f32,
711
- bE: f32
711
+ bq: f32
712
712
  ) -> vec3f {
713
- let tint = bh(material);
713
+ let tint = ba(material);
714
714
  if (!material.thinWalled) {
715
715
  return tint;
716
716
  }
717
- let jc = max(0.0, 1.0 - J * J);
718
- let ea = jc
719
- / max(bE * bE, 1e-9);
720
- if (ea >= 1.0) {
717
+ let iK = max(0.0, 1.0 - J * J);
718
+ let dM = iK
719
+ / max(bq * bq, 1e-9);
720
+ if (dM >= 1.0) {
721
721
  return vec3f(0.0);
722
722
  }
723
- let ae = sqrt(1.0 - ea);
724
- return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(ae, 1e-5)));
723
+ let ad = sqrt(1.0 - dM);
724
+ return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(ad, 1e-5)));
725
725
  }
726
726
 
727
- fn dX(
727
+ fn dK(
728
728
  material: OpenPbrResolvedMaterial,
729
729
  viewLocal: vec3f,
730
730
  lightLocal: vec3f,
@@ -734,102 +734,102 @@ pdf: ptr<function, f32>
734
734
  if ((viewLocal.z <= 0.0) | (lightLocal.z >= 0.0)) {
735
735
  return vec3f(0.0);
736
736
  }
737
- let ae = -lightLocal.z;
738
- let oY = cC(
737
+ let ad = -lightLocal.z;
738
+ let oO = sampling_dielectric_fresnel(
739
739
  viewLocal.z,
740
740
  material.relativeIor
741
741
  );
742
- *pdf = ae * INVPI;
743
- return vec3f(1.0 - oY) * INVPI;
742
+ *pdf = ad * INVPI;
743
+ return vec3f(1.0 - oO) * INVPI;
744
744
  }
745
745
 
746
- fn eg(prepared: ptr<function, ag>) {
746
+ fn dQ(prepared: ptr<function, OpenPbrPreparedBsdf>) {
747
747
 
748
748
 
749
- let sM = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
749
+ let sJ = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
750
750
  var total = (*prepared).probabilities[OPENPBR_LOBE_FUZZ];
751
- for (var jT = 1; jT < sM; jT++) {
752
- total += (*prepared).probabilities[jT];
751
+ for (var lobe = 1; lobe < sJ; lobe++) {
752
+ total += (*prepared).probabilities[lobe];
753
753
  }
754
754
  if (total <= 1e-8) {
755
- for (var jT = 0; jT < sM; jT++) {
756
- (*prepared).probabilities[jT] = 0.0;
755
+ for (var lobe = 0; lobe < sJ; lobe++) {
756
+ (*prepared).probabilities[lobe] = 0.0;
757
757
  }
758
758
  return;
759
759
  }
760
- let pk = 1.0 / total;
761
- for (var jT = 0; jT < sM; jT++) {
762
- (*prepared).probabilities[jT] *= pk;
760
+ let oZ = 1.0 / total;
761
+ for (var lobe = 0; lobe < sJ; lobe++) {
762
+ (*prepared).probabilities[lobe] *= oZ;
763
763
  }
764
764
  }
765
765
 
766
766
 
767
767
 
768
- fn bR(eta: f32) -> f32 {
768
+ fn bI(eta: f32) -> f32 {
769
769
  if (abs(eta - 1.0) < 1e-6) { return 0.0; }
770
770
  if (eta > 1.0) { return (eta - 1.0) / (4.08567 + 1.00071 * eta); }
771
771
  return 0.997118 + 0.1014 * eta - 0.965241 * eta * eta - 0.130607 * eta * eta * eta;
772
772
  }
773
773
 
774
- fn bU(f0: vec3f, tint: vec3f) -> vec3f {
775
- let dD = 1.0 / 7.0;
776
- let fX = mix(f0, vec3f(1.0), aI(dD));
777
- let b = fX * (vec3f(1.0) - tint) / (dD * pow(1.0 - dD, 6.0));
774
+ fn bL(f0: vec3f, tint: vec3f) -> vec3f {
775
+ let da = 1.0 / 7.0;
776
+ let fJ = mix(f0, vec3f(1.0), aH(da));
777
+ let b = fJ * (vec3f(1.0) - tint) / (da * pow(1.0 - da, 6.0));
778
778
  return clamp(f0 + (vec3f(1.0) - f0) / 21.0 - b / 126.0, vec3f(0.0), vec3f(1.0));
779
779
  }
780
780
 
781
781
 
782
782
 
783
- fn cN(material: OpenPbrResolvedMaterial, cosine: f32) -> vec3f {
783
+ fn cA(material: OpenPbrResolvedMaterial, cosine: f32) -> vec3f {
784
784
  if (cosine <= 0.0) { return vec3f(1.0); }
785
- let mp = sqrt(max(0.0, 1.0 - (1.0 - cosine * cosine) / (material.coatIor * material.coatIor)));
786
- let uT = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(mp, 1e-5)));
787
- return mix(vec3f(1.0), uT, material.coatWeight);
785
+ let lV = sqrt(max(0.0, 1.0 - (1.0 - cosine * cosine) / (material.coatIor * material.coatIor)));
786
+ let uZ = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(lV, 1e-5)));
787
+ return mix(vec3f(1.0), uZ, material.coatWeight);
788
788
  }
789
789
 
790
- fn gF(material: OpenPbrResolvedMaterial, cosine: f32) -> f32 {
790
+ fn gn(material: OpenPbrResolvedMaterial, cosine: f32) -> f32 {
791
791
  if (material.coatRoughness <= ROUGHNESS_MIN) {
792
- return af(cosine, 1.0 / material.coatIor);
792
+ return ae(cosine, 1.0 / material.coatIor);
793
793
  }
794
794
 
795
795
 
796
- return clamp(1.0 - aw(material.coatIor,
796
+ return clamp(1.0 - ar(material.coatIor,
797
797
  material.coatRoughness * material.coatRoughness, cosine), 0.0, 1.0);
798
798
  }
799
799
 
800
- fn hr(prepared: ag) -> vec3f {
800
+ fn gX(prepared: OpenPbrPreparedBsdf) -> vec3f {
801
801
  let material = prepared.material;
802
802
  let dielectric = 1.0 - material.baseMetalness;
803
803
  let opaque = dielectric * (1.0 - material.transmissionWeight) * (1.0 - material.subsurfaceWeight);
804
804
  let sss = dielectric * (1.0 - material.transmissionWeight) * material.subsurfaceWeight;
805
- let vI = dielectric * material.transmissionWeight;
806
- let gd = bR(prepared.specularEtaTOverEtaI);
807
- let lE = bR(1.0 / prepared.transmissionReflectionIor);
808
- let qI = clamp(opaque * gd + (sss + vI) * lE + material.baseMetalness, 0.0, 1.0);
809
- let jM = mix(1.0, material.specularRoughness, qI);
810
- let ks = bR(material.coatIor);
805
+ let vU = dielectric * material.transmissionWeight;
806
+ let fP = bI(prepared.specularEtaTOverEtaI);
807
+ let lg = bI(1.0 / prepared.transmissionReflectionIor);
808
+ let qA = clamp(opaque * fP + (sss + vU) * lg + material.baseMetalness, 0.0, 1.0);
809
+ let jt = mix(1.0, material.specularRoughness, qA);
810
+ let ks = bI(material.coatIor);
811
811
  let kr = 1.0 - (1.0 - ks) / (material.coatIor * material.coatIor);
812
- let k = mix(ks, kr, jM);
813
- let eb = material.baseMetalness * material.specularWeight * bU(material.baseWeight * material.baseColor, material.specularColor)
814
- + opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), gd)
815
- + sss * material.subsurfaceColor + vec3f(vI);
816
- let rZ = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
817
- return mix(vec3f(1.0), rZ, material.coatWeight * material.coatDarkening);
812
+ let k = mix(ks, kr, jt);
813
+ let eb = material.baseMetalness * material.specularWeight * bL(material.baseWeight * material.baseColor, material.specularColor)
814
+ + opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), fP)
815
+ + sss * material.subsurfaceColor + vec3f(vU);
816
+ let rV = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
817
+ return mix(vec3f(1.0), rV, material.coatWeight * material.coatDarkening);
818
818
  }
819
819
 
820
- fn cF(prepared: ag, lU: f32) -> vec3f {
820
+ fn cm(prepared: OpenPbrPreparedBsdf, lF: f32) -> vec3f {
821
821
  if (prepared.material.coatWeight <= 0.0) { return vec3f(1.0); }
822
822
  if (prepared.material.inside) {
823
823
 
824
- return cN(prepared.material, -lU);
824
+ return cA(prepared.material, -lF);
825
825
  }
826
826
 
827
- return prepared.coatBaseScale * cN(prepared.material, lU);
827
+ return prepared.coatBaseScale * cA(prepared.material, lF);
828
828
  }
829
829
 
830
830
 
831
831
  ${hasAnisotropyDirections ? /* wgsl */ `
832
- fn dM(fallback: bq, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> bq {
832
+ fn dk(fallback: OpenPbrBasis, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> OpenPbrBasis {
833
833
  var t = tangent - fallback.normal * dot(fallback.normal, tangent);
834
834
  if (dot(t, t) < 1e-8) { t = fallback.tangent; }
835
835
  t = normalize(t);
@@ -844,15 +844,15 @@ return basis;
844
844
  }
845
845
 
846
846
  ` : /* wgsl */ ``}
847
- fn ds(
847
+ fn bV(
848
848
  tangent: vec3f,
849
849
  material: OpenPbrResolvedMaterial,
850
- bM: vec3f,
850
+ bD: vec3f,
851
851
  normal: vec3f
852
- ) -> ag {
853
- var prepared: ag;
852
+ ) -> OpenPbrPreparedBsdf {
853
+ var prepared: OpenPbrPreparedBsdf;
854
854
  prepared.material = material;
855
- prepared.basis = fD(
855
+ prepared.basis = ff(
856
856
  tangent,
857
857
  normal,
858
858
  max(material.specularAnisotropy, material.coatAnisotropy)
@@ -864,39 +864,39 @@ ${hasCoatNormals ? /* wgsl */ `
864
864
 
865
865
 
866
866
  if (material.coatNormalEnabled) {
867
- prepared.coatBasis = fD(material.geometryTangent, material.coatNormal, material.coatAnisotropy);
867
+ prepared.coatBasis = ff(material.geometryTangent, material.coatNormal, material.coatAnisotropy);
868
868
  prepared.directionFrames = true;
869
869
  }
870
870
  ` : ''}
871
871
  if ((material.specularAnisotropy > 0.0) & material.anisotropyDirectionEnabled) {
872
- prepared.basis = dM(prepared.basis, material.directionTangent, material.directionBitangent, material.anisotropyDirection);
872
+ prepared.basis = dk(prepared.basis, material.directionTangent, material.directionBitangent, material.anisotropyDirection);
873
873
  prepared.directionFrames = true;
874
874
  }
875
875
  if ((material.coatAnisotropy > 0.0) & (material.coatAnisotropyRotation != 0.0)) {
876
- prepared.coatBasis = dM(prepared.coatBasis, material.geometryTangent, material.geometryBitangent, vec2f(cos(material.coatAnisotropyRotation), sin(material.coatAnisotropyRotation)));
876
+ prepared.coatBasis = dk(prepared.coatBasis, material.geometryTangent, material.geometryBitangent, vec2f(cos(material.coatAnisotropyRotation), sin(material.coatAnisotropyRotation)));
877
877
  prepared.directionFrames = true;
878
878
  }
879
879
  ` : /* wgsl */ ``}
880
- prepared.viewLocal = openpbr_to_local(prepared.basis, bM);
881
- ${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bM);` : ''}
880
+ prepared.viewLocal = openpbr_to_local(prepared.basis, bD);
881
+ ${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bD);` : ''}
882
882
  prepared.diffuseColor = material.baseColor;
883
883
 
884
- let cK = 1.0 - material.baseMetalness;
885
- let dW = cK
884
+ let cu = 1.0 - material.baseMetalness;
885
+ let dJ = cu
886
886
  * (1.0 - material.transmissionWeight);
887
887
  prepared.weights[OPENPBR_LOBE_FUZZ] = material.fuzzWeight;
888
888
  prepared.weights[OPENPBR_LOBE_COAT] = material.coatWeight;
889
889
  if (material.inside) { prepared.weights[OPENPBR_LOBE_COAT] = 0.0; }
890
890
  prepared.weights[OPENPBR_LOBE_METAL] = material.baseMetalness;
891
- prepared.weights[OPENPBR_LOBE_SPECULAR] = cK;
892
- prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cK
891
+ prepared.weights[OPENPBR_LOBE_SPECULAR] = cu;
892
+ prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cu
893
893
  * material.transmissionWeight;
894
- prepared.weights[OPENPBR_LOBE_DIFFUSE] = dW
894
+ prepared.weights[OPENPBR_LOBE_DIFFUSE] = dJ
895
895
  * (1.0 - material.subsurfaceWeight) * material.baseWeight;
896
- prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dW
896
+ prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dJ
897
897
  * material.subsurfaceWeight;
898
898
 
899
- prepared.specularEtaTOverEtaI = bi(
899
+ prepared.specularEtaTOverEtaI = bb(
900
900
  1.0 / material.relativeIor,
901
901
  material.specularWeight
902
902
  );
@@ -906,20 +906,20 @@ prepared.transmissionReflectionIor = prepared.material.relativeIor;
906
906
 
907
907
 
908
908
  if (material.coatWeight > 0.0) {
909
- var cm = 1.0;
910
- if (!material.inside) { cm = mix(1.0, material.coatIor, material.coatWeight); }
911
- let bB = cm * bi(
912
- material.specularIor / cm, material.specularWeight);
913
- var eF = bB / cm;
914
- if ((cm > bB) & (bB >= 1.0)) {
915
- eF = 1.0 / eF;
916
- }
917
- prepared.specularEtaTOverEtaI = eF;
918
- prepared.transmissionReflectionIor = 1.0 / eF;
919
- prepared.refractionEtaTOverEtaI = bB;
909
+ var bX = 1.0;
910
+ if (!material.inside) { bX = mix(1.0, material.coatIor, material.coatWeight); }
911
+ let bn = bX * bb(
912
+ material.specularIor / bX, material.specularWeight);
913
+ var eo = bn / bX;
914
+ if ((bX > bn) & (bn >= 1.0)) {
915
+ eo = 1.0 / eo;
916
+ }
917
+ prepared.specularEtaTOverEtaI = eo;
918
+ prepared.transmissionReflectionIor = 1.0 / eo;
919
+ prepared.refractionEtaTOverEtaI = bn;
920
920
  if (material.inside) {
921
- prepared.refractionEtaTOverEtaI = 1.0 / bB;
922
- prepared.transmissionReflectionIor = bB;
921
+ prepared.refractionEtaTOverEtaI = 1.0 / bn;
922
+ prepared.transmissionReflectionIor = bn;
923
923
  }
924
924
  prepared.material.relativeIor = 1.0 / prepared.refractionEtaTOverEtaI;
925
925
  }
@@ -941,49 +941,49 @@ prepared.thinFilmBaseIor = prepared.refractionEtaTOverEtaI;
941
941
  prepared.specularAlpha = material.specularRoughness
942
942
  * material.specularRoughness;
943
943
  let viewCosine = abs(prepared.viewLocal.z);
944
- let ai = af(
944
+ let ag = ae(
945
945
  viewCosine,
946
946
  1.0 / prepared.specularEtaTOverEtaI
947
947
  );
948
- let fN = material.specularColor * select(
949
- ai,
948
+ let fu = material.specularColor * select(
949
+ ag,
950
950
  mix(
951
- ai,
952
- cZ(ai),
951
+ ag,
952
+ cL(ag),
953
953
  material.transmissionWeight
954
954
  ),
955
955
  material.thinWalled
956
956
  );
957
- let iv = material.specularWeight * cw(
957
+ let hS = material.specularWeight * openpbr_metal_fresnel(
958
958
  viewCosine,
959
959
  material.baseWeight * material.baseColor,
960
960
  material.specularColor
961
961
  );
962
- let eZ = select(
963
- af(viewCosine, prepared.transmissionReflectionIor),
964
- cZ(af(viewCosine, prepared.transmissionReflectionIor)),
962
+ let eI = select(
963
+ ae(viewCosine, prepared.transmissionReflectionIor),
964
+ cL(ae(viewCosine, prepared.transmissionReflectionIor)),
965
965
  material.thinWalled
966
966
  );
967
- let hb = bN(
967
+ let gK = bF(
968
968
  material,
969
969
  viewCosine,
970
970
  prepared.refractionEtaTOverEtaI
971
971
  );
972
- let iM = aw(
972
+ let ir = ar(
973
973
  prepared.specularEtaTOverEtaI,
974
974
  prepared.specularAlpha,
975
975
  viewCosine
976
976
  );
977
- let gH = cA(
977
+ let gq = cj(
978
978
  prepared.specularEtaTOverEtaI,
979
979
  prepared.specularAlpha
980
980
  );
981
- prepared.diffuseSpecularEnergyCompensation = iM
982
- / max(gH, 1e-12);
981
+ prepared.diffuseSpecularEnergyCompensation = ir
982
+ / max(gq, 1e-12);
983
983
 
984
984
  prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
985
- * aE(material.fuzzColor)
986
- * max(aU(
985
+ * aB(material.fuzzColor)
986
+ * max(aQ(
987
987
  viewCosine,
988
988
  material.fuzzRoughness
989
989
  ), 0.02);
@@ -991,32 +991,32 @@ prepared.probabilities[OPENPBR_LOBE_COAT] = 0.0;
991
991
  prepared.coatBaseScale = vec3f(1.0);
992
992
  if ((material.coatWeight > 0.0) & !material.inside) {
993
993
  ${hasCoatNormals ? /* wgsl */ `let coatViewCosine = select(viewCosine, max(prepared.coatViewLocal.z, 0.0), material.coatNormalEnabled);` : ''}
994
- let lf = gF(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
995
- prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * lf;
996
- prepared.coatBaseScale = cN(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
997
- * (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * lf) * hr(prepared);
994
+ let kO = gn(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
995
+ prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kO;
996
+ prepared.coatBaseScale = cA(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
997
+ * (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kO) * gX(prepared);
998
998
  }
999
999
  prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
1000
- * aE(iv);
1000
+ * aB(hS);
1001
1001
  prepared.metalMsScale = vec3f(0.0);
1002
1002
  prepared.metalMsFactor = 0.0;
1003
1003
  prepared.metalMsProbability = 0.0;
1004
1004
 
1005
1005
 
1006
1006
  if ((material.specularRoughness >= 0.04) & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0)) {
1007
- let ig = bU(material.baseWeight * material.baseColor, material.specularColor);
1008
- prepared.metalMsScale = material.specularWeight * ig * ig;
1009
- let qO = aV(prepared.specularAlpha, viewCosine);
1010
- prepared.metalMsFactor = qO / max(cD(prepared.specularAlpha), 1e-12);
1011
- let fC = prepared.weights[OPENPBR_LOBE_METAL] * aE(prepared.metalMsScale) * qO;
1012
- prepared.probabilities[OPENPBR_LOBE_METAL] += fC;
1013
- prepared.metalMsProbability = fC / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1007
+ let hI = bL(material.baseWeight * material.baseColor, material.specularColor);
1008
+ prepared.metalMsScale = material.specularWeight * hI * hI;
1009
+ let qF = aR(prepared.specularAlpha, viewCosine);
1010
+ prepared.metalMsFactor = qF / max(cl(prepared.specularAlpha), 1e-12);
1011
+ let fe = prepared.weights[OPENPBR_LOBE_METAL] * aB(prepared.metalMsScale) * qF;
1012
+ prepared.probabilities[OPENPBR_LOBE_METAL] += fe;
1013
+ prepared.metalMsProbability = fe / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1014
1014
  }
1015
1015
  prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
1016
- * aE(fN);
1016
+ * aB(fu);
1017
1017
  prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1018
- * (1.0 - eZ)
1019
- * aE(hb);
1018
+ * (1.0 - eI)
1019
+ * aB(gK);
1020
1020
 
1021
1021
 
1022
1022
 
@@ -1031,59 +1031,59 @@ prepared.dielectricMsProbability = 0.0;
1031
1031
  if (!material.thinWalled & (material.transmissionWeight > 0.0) &
1032
1032
  (prepared.specularAlpha >= 0.0016) & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) &
1033
1033
  (abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6)) {
1034
- let mo = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
1035
- prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * mo;
1036
- prepared.dielectricMsTransmissionScale = hb * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1034
+ let lU = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
1035
+ prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * lU;
1036
+ prepared.dielectricMsTransmissionScale = gK * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1037
1037
  + vec3f(prepared.weights[OPENPBR_LOBE_SUBSURFACE]);
1038
- prepared.dielectricMsReflectionRatio = ck(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
1039
- prepared.dielectricMsViewLoss = bb(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
1040
- let oR = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
1041
- let fC = aE(oR) * prepared.dielectricMsViewLoss;
1042
- prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fC;
1043
- prepared.dielectricMsProbability = fC / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1038
+ prepared.dielectricMsReflectionRatio = bU(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
1039
+ prepared.dielectricMsViewLoss = aV(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
1040
+ let oG = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
1041
+ let fe = aB(oG) * prepared.dielectricMsViewLoss;
1042
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fe;
1043
+ prepared.dielectricMsProbability = fe / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1044
1044
  }
1045
1045
  prepared.probabilities[OPENPBR_LOBE_DIFFUSE] = prepared.weights[OPENPBR_LOBE_DIFFUSE]
1046
- * aE(prepared.diffuseColor)
1046
+ * aB(prepared.diffuseColor)
1047
1047
  * prepared.diffuseSpecularEnergyCompensation;
1048
1048
  prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] = prepared.weights[OPENPBR_LOBE_SUBSURFACE]
1049
- * (1.0 - eZ)
1050
- * aE(material.subsurfaceColor)
1049
+ * (1.0 - eI)
1050
+ * aB(material.subsurfaceColor)
1051
1051
  * prepared.diffuseSpecularEnergyCompensation;
1052
1052
 
1053
1053
 
1054
1054
  if ((material.coatWeight > 0.0) & HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
1055
- let lS = 0.02 * bS(material.thinFilmThickness, material.thinFilmWeight);
1056
- prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * lS);
1057
- prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lS);
1055
+ let lD = 0.02 * bJ(material.thinFilmThickness, material.thinFilmWeight);
1056
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * lD);
1057
+ prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lD);
1058
1058
  }
1059
1059
  if ((material.coatWeight > 0.0) & !material.inside) {
1060
- let gI = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
1061
- prepared.probabilities[OPENPBR_LOBE_METAL] *= gI;
1062
- prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gI;
1063
- prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gI;
1064
- prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gI;
1065
- prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gI;
1066
- }
1067
- eg(&prepared);
1060
+ let gr = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
1061
+ prepared.probabilities[OPENPBR_LOBE_METAL] *= gr;
1062
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gr;
1063
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gr;
1064
+ prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gr;
1065
+ prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gr;
1066
+ }
1067
+ dQ(&prepared);
1068
1068
  return prepared;
1069
1069
  }
1070
1070
 
1071
1071
 
1072
- fn cY(prepared: ag, cosine: f32, reflection: bool) -> f32 {
1072
+ fn cK(prepared: OpenPbrPreparedBsdf, cosine: f32, reflection: bool) -> f32 {
1073
1073
  if (prepared.material.coatWeight <= 0.0) {
1074
- return af(cosine, prepared.material.relativeIor);
1074
+ return ae(cosine, prepared.material.relativeIor);
1075
1075
  }
1076
- let kU = af(cosine, prepared.transmissionReflectionIor);
1077
- if (!reflection) { return kU; }
1078
- let oj = af(cosine, 1.0 / prepared.specularEtaTOverEtaI);
1079
- let sQ = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
1080
- return mix(oj, kU, sQ);
1076
+ let kA = ae(cosine, prepared.transmissionReflectionIor);
1077
+ if (!reflection) { return kA; }
1078
+ let nY = ae(cosine, 1.0 / prepared.specularEtaTOverEtaI);
1079
+ let sN = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
1080
+ return mix(nY, kA, sN);
1081
1081
  }
1082
1082
 
1083
- fn nA(
1084
- prepared: ag,
1083
+ fn nh(
1084
+ prepared: OpenPbrPreparedBsdf,
1085
1085
  lightDirection: vec3f,
1086
- hc: i32,
1086
+ gL: i32,
1087
1087
  pdf: ptr<function, f32>
1088
1088
  ) -> vec3f {
1089
1089
  let material = prepared.material;
@@ -1097,73 +1097,73 @@ let coatLightCosine = dot(prepared.coatBasis.normal, lightDirection);
1097
1097
  let coatReflection = geometricReflection & (prepared.coatViewLocal.z > 0.0) & (coatLightCosine > 0.0);
1098
1098
  ` : ''}
1099
1099
 
1100
- var ad: vec3f;
1100
+ var aa: vec3f;
1101
1101
  if (reflection) {
1102
- ad = normalize(lightLocal + viewLocal);
1102
+ aa = normalize(lightLocal + viewLocal);
1103
1103
  }
1104
1104
  else {
1105
- ad = normalize(lightLocal + viewLocal * material.relativeIor);
1105
+ aa = normalize(lightLocal + viewLocal * material.relativeIor);
1106
1106
  }
1107
- if (ad.z < 0.0) {
1108
- ad = -ad;
1107
+ if (aa.z < 0.0) {
1108
+ aa = -aa;
1109
1109
  }
1110
1110
 
1111
1111
  var response = vec3f(0.0);
1112
1112
  *pdf = 0.0;
1113
- var aM = 0.0;
1114
- let mO = hc < 0;
1115
- let ws = mO | (hc == OPENPBR_LOBE_FUZZ);
1116
- let uA = mO | (hc == OPENPBR_LOBE_COAT);
1117
- let tn = mO | (hc == OPENPBR_LOBE_METAL);
1118
- let rf = mO | (hc == OPENPBR_LOBE_SPECULAR);
1119
- let kd = mO | (hc == OPENPBR_LOBE_TRANSMISSION);
1120
- let uF = mO | (hc == OPENPBR_LOBE_DIFFUSE);
1121
- let pP = mO | (hc == OPENPBR_LOBE_SUBSURFACE);
1122
- let bm = abs(dot(viewLocal, ad));
1113
+ var lobePdf = 0.0;
1114
+ let mA = gL < 0;
1115
+ let wP = mA | (gL == OPENPBR_LOBE_FUZZ);
1116
+ let uE = mA | (gL == OPENPBR_LOBE_COAT);
1117
+ let tn = mA | (gL == OPENPBR_LOBE_METAL);
1118
+ let qW = mA | (gL == OPENPBR_LOBE_SPECULAR);
1119
+ let jJ = mA | (gL == OPENPBR_LOBE_TRANSMISSION);
1120
+ let uJ = mA | (gL == OPENPBR_LOBE_DIFFUSE);
1121
+ let pG = mA | (gL == OPENPBR_LOBE_SUBSURFACE);
1122
+ let viewHalf = abs(dot(viewLocal, aa));
1123
1123
 
1124
1124
 
1125
1125
 
1126
- var du = ad;
1127
- var jK = bm;
1126
+ var thinWallHalf = aa;
1127
+ var dielectricViewHalf = viewHalf;
1128
1128
  if (!reflection & material.thinWalled) {
1129
- du = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
1130
- if (du.z < 0.0) { du = -du; }
1131
- jK = abs(dot(viewLocal, du));
1129
+ thinWallHalf = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
1130
+ if (thinWallHalf.z < 0.0) { thinWallHalf = -thinWallHalf; }
1131
+ dielectricViewHalf = abs(dot(viewLocal, thinWallHalf));
1132
1132
  }
1133
- let ne =
1134
- (reflection & (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & rf) |
1135
- (!reflection & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & kd);
1136
- let rk = reflection & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn;
1137
- var oA: array<vec3f, 2>;
1138
- if (ne) {
1139
- oA[0] = vec3f(cY(prepared, jK, reflection));
1133
+ let mP =
1134
+ (reflection & (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & qW) |
1135
+ (!reflection & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & jJ);
1136
+ let ra = reflection & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn;
1137
+ var oq: array<vec3f, 2>;
1138
+ if (mP) {
1139
+ oq[0] = vec3f(cK(prepared, dielectricViewHalf, reflection));
1140
1140
  }
1141
- if (rk) {
1142
- oA[1] = cw(bm, material.baseWeight * material.baseColor, material.specularColor);
1141
+ if (ra) {
1142
+ oq[1] = openpbr_metal_fresnel(viewHalf, material.baseWeight * material.baseColor, material.specularColor);
1143
1143
  }
1144
1144
  if (HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
1145
- let wavelengths = vec3f(620.0, 540.0, 450.0);
1145
+ let vV = vec3f(620.0, 540.0, 450.0);
1146
1146
 
1147
- for (var lD = 0u; lD < (rtUniform.loopUnrollGuard >> 1u); lD++) {
1148
- if (!select(ne, rk, lD == 1u)) { continue; }
1149
- var yi = vec3f(0.0);
1150
- let J = select(jK, bm, lD == 1u);
1147
+ for (var lf = 0u; lf < (rtUniform.loopUnrollGuard >> 1u); lf++) {
1148
+ if (!select(mP, ra, lf == 1u)) { continue; }
1149
+ var wY = vec3f(0.0);
1150
+ let J = select(dielectricViewHalf, viewHalf, lf == 1u);
1151
1151
  for (var channel = 0u; channel + 1u < rtUniform.loopUnrollGuard; channel++) {
1152
1152
  var ior = vec2f(prepared.thinFilmBaseIor, 0.0);
1153
- if (lD == 1u) {
1154
- ior = cX(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
1153
+ if (lf == 1u) {
1154
+ ior = cJ(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
1155
1155
  }
1156
- yi[channel] = au(J,
1157
- wavelengths[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
1156
+ wY[channel] = ap(J,
1157
+ vV[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
1158
1158
  }
1159
- oA[lD] = mix(oA[lD], yi,
1160
- bS(material.thinFilmThickness, material.thinFilmWeight));
1159
+ oq[lf] = mix(oq[lf], wY,
1160
+ bJ(material.thinFilmThickness, material.thinFilmWeight));
1161
1161
  }
1162
1162
  }
1163
- let ey = oA[0];
1163
+ let ef = oq[0];
1164
1164
  let diffuseSpecularEnergyCompensation =
1165
1165
  prepared.diffuseSpecularEnergyCompensation
1166
- * aw(
1166
+ * ar(
1167
1167
  prepared.specularEtaTOverEtaI,
1168
1168
  prepared.specularAlpha,
1169
1169
  abs(lightLocal.z)
@@ -1174,156 +1174,156 @@ ${hasCoatNormals ? /* wgsl */ `
1174
1174
  if (!independentCoat | ((lightLocal.z != 0.0) & (reflection == geometricReflection))) {
1175
1175
  ` : ''}
1176
1176
  if (reflection) {
1177
- if ((prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0) & uF) {
1178
- response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * bJ(
1177
+ if ((prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0) & uJ) {
1178
+ response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * bw(
1179
1179
  material,
1180
1180
  prepared.diffuseColor,
1181
1181
  viewLocal,
1182
1182
  lightLocal,
1183
1183
  diffuseSpecularEnergyCompensation,
1184
- &aM
1184
+ &lobePdf
1185
1185
  );
1186
- *pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * aM;
1186
+ *pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * lobePdf;
1187
1187
  }
1188
1188
 
1189
- if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & material.thinWalled & pP) {
1190
- response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * bJ(
1189
+ if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & material.thinWalled & pG) {
1190
+ response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * bw(
1191
1191
  material,
1192
1192
  material.subsurfaceColor,
1193
1193
  viewLocal,
1194
1194
  lightLocal,
1195
1195
  diffuseSpecularEnergyCompensation,
1196
- &aM
1196
+ &lobePdf
1197
1197
  );
1198
- *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * aM;
1198
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * lobePdf;
1199
1199
  }
1200
1200
 
1201
- if ((prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & rf) {
1202
- var cB = ey;
1201
+ if ((prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & qW) {
1202
+ var ck = ef;
1203
1203
  if (material.thinWalled) {
1204
- cB = av(
1205
- cB,
1204
+ ck = aq(
1205
+ ck,
1206
1206
  material.transmissionWeight
1207
1207
  );
1208
1208
  }
1209
- let bG = material.specularColor * cB;
1210
- response += prepared.weights[OPENPBR_LOBE_SPECULAR] * ao(
1209
+ let fresnel = material.specularColor * ck;
1210
+ response += prepared.weights[OPENPBR_LOBE_SPECULAR] * aj(
1211
1211
  material,
1212
1212
  viewLocal,
1213
1213
  lightLocal,
1214
- ad,
1215
- bG,
1216
- &aM
1214
+ aa,
1215
+ fresnel,
1216
+ &lobePdf
1217
1217
  );
1218
- *pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * aM;
1218
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * lobePdf;
1219
1219
  }
1220
1220
 
1221
1221
  if ((prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn) {
1222
- let bG = material.specularWeight * oA[1];
1223
- response += prepared.weights[OPENPBR_LOBE_METAL] * ao(
1222
+ let fresnel = material.specularWeight * oq[1];
1223
+ response += prepared.weights[OPENPBR_LOBE_METAL] * aj(
1224
1224
  material,
1225
1225
  viewLocal,
1226
1226
  lightLocal,
1227
- ad,
1228
- bG,
1229
- &aM
1227
+ aa,
1228
+ fresnel,
1229
+ &lobePdf
1230
1230
  );
1231
1231
  if (prepared.metalMsFactor > 0.0) {
1232
- let cL = min(prepared.metalMsFactor * aV(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
1233
- response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * cL * INVPI;
1234
- aM = mix(aM, 0.5 * INVPI, prepared.metalMsProbability);
1232
+ let cv = min(prepared.metalMsFactor * aR(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
1233
+ response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * cv * INVPI;
1234
+ lobePdf = mix(lobePdf, 0.5 * INVPI, prepared.metalMsProbability);
1235
1235
  }
1236
- *pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * aM;
1236
+ *pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * lobePdf;
1237
1237
  }
1238
1238
  }
1239
1239
  else {
1240
- let bG = ey;
1241
- if ((prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & kd) {
1240
+ let fresnel = ef;
1241
+ if ((prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & jJ) {
1242
1242
  if (material.thinWalled) {
1243
- let lI = vec3f(lightLocal.xy, -lightLocal.z);
1244
- let gA = av(
1245
- ey,
1243
+ let lm = vec3f(lightLocal.xy, -lightLocal.z);
1244
+ let gk = aq(
1245
+ ef,
1246
1246
  1.0
1247
1247
  );
1248
- let tint = bN(
1248
+ let tint = bF(
1249
1249
  material,
1250
1250
  abs(viewLocal.z),
1251
1251
  prepared.refractionEtaTOverEtaI
1252
1252
  );
1253
1253
  response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1254
- * ao(
1254
+ * aj(
1255
1255
  material,
1256
1256
  viewLocal,
1257
- lI,
1258
- du,
1259
- tint * (vec3f(1.0) - gA),
1260
- &aM
1257
+ lm,
1258
+ thinWallHalf,
1259
+ tint * (vec3f(1.0) - gk),
1260
+ &lobePdf
1261
1261
  );
1262
1262
  }
1263
1263
  else {
1264
1264
  response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1265
- * dE(
1265
+ * dc(
1266
1266
  material,
1267
1267
  material.relativeIor,
1268
- bh(material),
1268
+ ba(material),
1269
1269
  viewLocal,
1270
1270
  lightLocal,
1271
- ad,
1272
- bG,
1273
- &aM
1271
+ aa,
1272
+ fresnel,
1273
+ &lobePdf
1274
1274
  );
1275
1275
  }
1276
1276
  if (prepared.dielectricMsProbability > 0.0) {
1277
- aM *= 1.0 - prepared.dielectricMsProbability;
1277
+ lobePdf *= 1.0 - prepared.dielectricMsProbability;
1278
1278
  }
1279
- *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * aM;
1279
+ *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * lobePdf;
1280
1280
  }
1281
- if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & pP) {
1281
+ if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & pG) {
1282
1282
  if (material.thinWalled) {
1283
- let pb = vec3f(lightLocal.xy, -lightLocal.z);
1283
+ let oQ = vec3f(lightLocal.xy, -lightLocal.z);
1284
1284
  response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
1285
- * bJ(
1285
+ * bw(
1286
1286
  material,
1287
1287
  material.subsurfaceColor,
1288
1288
  viewLocal,
1289
- pb,
1289
+ oQ,
1290
1290
  diffuseSpecularEnergyCompensation,
1291
- &aM
1291
+ &lobePdf
1292
1292
  );
1293
- aM *= 0.5;
1293
+ lobePdf *= 0.5;
1294
1294
  }
1295
1295
  else {
1296
- response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dX(
1296
+ response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dK(
1297
1297
  material,
1298
1298
  viewLocal,
1299
1299
  lightLocal,
1300
- &aM
1300
+ &lobePdf
1301
1301
  );
1302
1302
  }
1303
- *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * aM;
1303
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * lobePdf;
1304
1304
  }
1305
1305
  }
1306
1306
 
1307
1307
 
1308
1308
 
1309
1309
 
1310
- if ((prepared.dielectricMsProbability > 0.0) & kd) {
1310
+ if ((prepared.dielectricMsProbability > 0.0) & jJ) {
1311
1311
  let cosine = abs(lightLocal.z);
1312
1312
  if (cosine > 0.0) {
1313
1313
  let ior = select(1.0 / prepared.refractionEtaTOverEtaI, prepared.refractionEtaTOverEtaI, reflection);
1314
- let ju = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
1315
- let oZ = prepared.dielectricMsViewLoss * bb(ior, prepared.specularAlpha, cosine)
1316
- / max(bf(ior, prepared.specularAlpha), 1e-12);
1317
- let cL = min(oZ * ju, 1.0 / cosine);
1314
+ let iZ = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
1315
+ let oP = prepared.dielectricMsViewLoss * aV(ior, prepared.specularAlpha, cosine)
1316
+ / max(aY(ior, prepared.specularAlpha), 1e-12);
1317
+ let cv = min(oP * iZ, 1.0 / cosine);
1318
1318
  let scale = select(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, reflection);
1319
- response += scale * cL * INVPI;
1320
- *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * ju * 0.5 * INVPI;
1319
+ response += scale * cv * INVPI;
1320
+ *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * iZ * 0.5 * INVPI;
1321
1321
  }
1322
1322
  }
1323
1323
 
1324
1324
  ${hasCoatNormals ? /* wgsl */ ` } ` : ''}
1325
1325
  if (material.coatWeight > 0.0) {
1326
- response *= cF(prepared, ${hasCoatNormals ? 'select(lightLocal.z, coatLightCosine, independentCoat)' : 'lightLocal.z'});
1326
+ response *= cm(prepared, ${hasCoatNormals ? 'select(lightLocal.z, coatLightCosine, independentCoat)' : 'lightLocal.z'});
1327
1327
  }
1328
1328
  ${hasCoatNormals ? /* wgsl */ `
1329
1329
 
@@ -1332,134 +1332,134 @@ if (independentCoat) { response *= abs(lightLocal.z); }
1332
1332
 
1333
1333
  ${hasAnisotropyDirections ? /* wgsl */ `
1334
1334
  if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_COAT] > 0.0)) {
1335
- var dT = viewLocal;
1336
- var lh = lightLocal;
1337
- var gL = ad;
1338
- var kk = bm;
1335
+ var dG = viewLocal;
1336
+ var kQ = lightLocal;
1337
+ var coatHalf = aa;
1338
+ var coatViewHalf = viewHalf;
1339
1339
  if (prepared.directionFrames) {
1340
- dT = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
1341
- lh = openpbr_to_local(prepared.coatBasis, lightDirection);
1342
- gL = normalize(lh + dT);
1343
- if (gL.z < 0.0) { gL = -gL; }
1344
- kk = abs(dot(dT, gL));
1340
+ dG = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
1341
+ kQ = openpbr_to_local(prepared.coatBasis, lightDirection);
1342
+ coatHalf = normalize(kQ + dG);
1343
+ if (coatHalf.z < 0.0) { coatHalf = -coatHalf; }
1344
+ coatViewHalf = abs(dot(dG, coatHalf));
1345
1345
  }
1346
1346
 
1347
- let lQ = vec3f(af(
1348
- kk,
1347
+ let lB = vec3f(ae(
1348
+ coatViewHalf,
1349
1349
  1.0 / material.coatIor
1350
1350
  ));
1351
- var dS = material;
1352
- let jX = aN(material.coatRoughness, material.coatAnisotropy);
1353
- dS.alphaX = jX.x;
1354
- dS.alphaY = jX.y;
1355
- if (uA) {
1356
- response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * ao(
1357
- dS,
1358
- dT,
1359
- lh,
1360
- gL,
1361
- lQ,
1362
- &aM
1351
+ var dF = material;
1352
+ let jD = aL(material.coatRoughness, material.coatAnisotropy);
1353
+ dF.alphaX = jD.x;
1354
+ dF.alphaY = jD.y;
1355
+ if (uE) {
1356
+ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * aj(
1357
+ dF,
1358
+ dG,
1359
+ kQ,
1360
+ coatHalf,
1361
+ lB,
1362
+ &lobePdf
1363
1363
  );
1364
- *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aM;
1364
+ *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * lobePdf;
1365
1365
  }
1366
1366
  }
1367
1367
  ` : /* wgsl */ `
1368
1368
  if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_COAT] > 0.0)) {
1369
- let lQ = vec3f(af(
1370
- bm,
1369
+ let lB = vec3f(ae(
1370
+ viewHalf,
1371
1371
  1.0 / material.coatIor
1372
1372
  ));
1373
- var dS = material;
1374
- let jX = aN(material.coatRoughness, material.coatAnisotropy);
1375
- dS.alphaX = jX.x;
1376
- dS.alphaY = jX.y;
1377
- if (uA) {
1378
- response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * ao(
1379
- dS,
1373
+ var dF = material;
1374
+ let jD = aL(material.coatRoughness, material.coatAnisotropy);
1375
+ dF.alphaX = jD.x;
1376
+ dF.alphaY = jD.y;
1377
+ if (uE) {
1378
+ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * aj(
1379
+ dF,
1380
1380
  viewLocal,
1381
1381
  lightLocal,
1382
- ad,
1383
- lQ,
1384
- &aM
1382
+ aa,
1383
+ lB,
1384
+ &lobePdf
1385
1385
  );
1386
- *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aM;
1386
+ *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * lobePdf;
1387
1387
  }
1388
1388
  }
1389
1389
  `}
1390
1390
 
1391
1391
  if (${hasCoatNormals ? 'select(reflection, geometricReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_FUZZ] > 0.0)) {
1392
- let rC = aU(
1392
+ let rt = aQ(
1393
1393
  abs(viewLocal.z),
1394
1394
  material.fuzzRoughness
1395
1395
  );
1396
1396
  response *= max(
1397
1397
  vec3f(0.0),
1398
- vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * rC)
1398
+ vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * rt)
1399
1399
  );
1400
- if (ws) {
1401
- response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * kD(
1400
+ if (wP) {
1401
+ response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * kg(
1402
1402
  material,
1403
1403
  viewLocal,
1404
1404
  lightLocal,
1405
- &aM
1405
+ &lobePdf
1406
1406
  );
1407
- *pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * aM;
1407
+ *pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * lobePdf;
1408
1408
  }
1409
1409
  }
1410
1410
 
1411
1411
  return response * ${hasCoatNormals ? 'select(abs(lightLocal.z), 1.0, independentCoat)' : 'abs(lightLocal.z)'};
1412
1412
  }
1413
1413
 
1414
- fn bO(
1415
- prepared: ag,
1414
+ fn openpbr_eval_prepared(
1415
+ prepared: OpenPbrPreparedBsdf,
1416
1416
  lightDirection: vec3f,
1417
1417
  pdf: ptr<function, f32>
1418
1418
  ) -> vec3f {
1419
- return nA(prepared, lightDirection, -1, pdf);
1419
+ return nh(prepared, lightDirection, -1, pdf);
1420
1420
  }
1421
1421
 
1422
1422
 
1423
1423
 
1424
1424
 
1425
1425
 
1426
- fn sp(
1426
+ fn sj(
1427
1427
  tangent: vec3f,
1428
1428
  material: OpenPbrResolvedMaterial,
1429
- bM: vec3f,
1429
+ bD: vec3f,
1430
1430
  normal: vec3f,
1431
1431
  lightDirection: vec3f,
1432
1432
  pdf: ptr<function, f32>
1433
1433
  ) -> vec3f {
1434
- let prepared = ds(
1434
+ let prepared = bV(
1435
1435
  tangent,
1436
1436
  material,
1437
- bM,
1437
+ bD,
1438
1438
  normal
1439
1439
  );
1440
- return bO(prepared, lightDirection, pdf);
1440
+ return openpbr_eval_prepared(prepared, lightDirection, pdf);
1441
1441
  }
1442
1442
 
1443
1443
 
1444
1444
 
1445
1445
 
1446
1446
 
1447
- fn jq(
1448
- prepared: ag, cq: vec3f,
1447
+ fn iW(
1448
+ prepared: OpenPbrPreparedBsdf, cc: vec3f,
1449
1449
  lightDirection: ptr<function, vec3f>, isTransmissionEvent: ptr<function, bool>,
1450
- aS: ptr<function, f32>, bu: ptr<function, bool>,
1451
- cO: ptr<function, bool>, bn: ptr<function, u32>
1450
+ aO: ptr<function, f32>, bk: ptr<function, bool>,
1451
+ cC: ptr<function, bool>, bh: ptr<function, u32>
1452
1452
  ) -> bool {
1453
1453
  let material = prepared.material;
1454
1454
  let viewLocal = prepared.viewLocal;
1455
- var cH = cq.x;
1456
- let fL = cq.y;
1457
- let bv = cq.z;
1455
+ var cp = cc.x;
1456
+ let fp = cc.y;
1457
+ let bl = cc.z;
1458
1458
  *isTransmissionEvent = false;
1459
- *aS = 1.0;
1460
- *bu = false;
1461
- *cO = false;
1462
- *bn = u32(OPENPBR_LOBE_DIFFUSE);
1459
+ *aO = 1.0;
1460
+ *bk = false;
1461
+ *cC = false;
1462
+ *bh = u32(OPENPBR_LOBE_DIFFUSE);
1463
1463
  *lightDirection = prepared.basis.normal;
1464
1464
 
1465
1465
  var cdf: array<f32, OPENPBR_LOBE_COUNT>;
@@ -1470,40 +1470,40 @@ return false;
1470
1470
  }
1471
1471
 
1472
1472
  var lightLocal: vec3f;
1473
- if ((bv < cdf[OPENPBR_LOBE_FUZZ]) | (
1474
- (bv >= cdf[OPENPBR_LOBE_TRANSMISSION]) & (bv < cdf[OPENPBR_LOBE_DIFFUSE])
1473
+ if ((bl < cdf[OPENPBR_LOBE_FUZZ]) | (
1474
+ (bl >= cdf[OPENPBR_LOBE_TRANSMISSION]) & (bl < cdf[OPENPBR_LOBE_DIFFUSE])
1475
1475
  )) {
1476
- let qG = bv < cdf[OPENPBR_LOBE_FUZZ];
1477
- *aS = select(
1476
+ let qy = bl < cdf[OPENPBR_LOBE_FUZZ];
1477
+ *aO = select(
1478
1478
  1.0,
1479
1479
  material.fuzzRoughness,
1480
- qG
1480
+ qy
1481
1481
  );
1482
- *cO = !qG;
1483
- *bn = select(
1482
+ *cC = !qy;
1483
+ *bh = select(
1484
1484
  u32(OPENPBR_LOBE_DIFFUSE),
1485
1485
  u32(OPENPBR_LOBE_FUZZ),
1486
- qG
1486
+ qy
1487
1487
  );
1488
- lightLocal = aO(vec2f(cH, fL));
1488
+ lightLocal = aM(vec2f(cp, fp));
1489
1489
  }
1490
1490
  ${hasAnisotropyDirections ? /* wgsl */ `
1491
- else if (bv < cdf[OPENPBR_LOBE_COAT]) {
1492
- *aS = material.coatRoughness;
1493
- *bu = true;
1494
- *bn = u32(OPENPBR_LOBE_COAT);
1495
- var dT = viewLocal;
1496
- if (prepared.directionFrames) { dT = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, material.coatNormalEnabled)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'}; }
1497
- var ad = aD(
1498
- dT,
1499
-
1500
- aN(material.coatRoughness, material.coatAnisotropy),
1501
- vec2f(cH, fL)
1491
+ else if (bl < cdf[OPENPBR_LOBE_COAT]) {
1492
+ *aO = material.coatRoughness;
1493
+ *bk = true;
1494
+ *bh = u32(OPENPBR_LOBE_COAT);
1495
+ var dG = viewLocal;
1496
+ if (prepared.directionFrames) { dG = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, material.coatNormalEnabled)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'}; }
1497
+ var aa = aA(
1498
+ dG,
1499
+
1500
+ aL(material.coatRoughness, material.coatAnisotropy),
1501
+ vec2f(cp, fp)
1502
1502
  );
1503
- if (ad.z < 0.0) {
1504
- ad = -ad;
1503
+ if (aa.z < 0.0) {
1504
+ aa = -aa;
1505
1505
  }
1506
- lightLocal = normalize(reflect(-dT, ad));
1506
+ lightLocal = normalize(reflect(-dG, aa));
1507
1507
  ${hasCoatNormals ? /* wgsl */ `
1508
1508
  if (material.coatNormalEnabled) {
1509
1509
 
@@ -1514,87 +1514,87 @@ return (lightLocal.z > 0.0) & (dot(material.geometricNormal, *lightDirection) >
1514
1514
  if (prepared.directionFrames) { lightLocal = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.coatBasis, lightLocal)); }
1515
1515
  }
1516
1516
  ` : /* wgsl */ `
1517
- else if (bv < cdf[OPENPBR_LOBE_COAT]) {
1518
- *aS = material.coatRoughness;
1519
- *bu = true;
1520
- *bn = u32(OPENPBR_LOBE_COAT);
1521
- var ad = aD(
1517
+ else if (bl < cdf[OPENPBR_LOBE_COAT]) {
1518
+ *aO = material.coatRoughness;
1519
+ *bk = true;
1520
+ *bh = u32(OPENPBR_LOBE_COAT);
1521
+ var aa = aA(
1522
1522
  viewLocal,
1523
1523
 
1524
- aN(material.coatRoughness, material.coatAnisotropy),
1525
- vec2f(cH, fL)
1524
+ aL(material.coatRoughness, material.coatAnisotropy),
1525
+ vec2f(cp, fp)
1526
1526
  );
1527
- if (ad.z < 0.0) {
1528
- ad = -ad;
1527
+ if (aa.z < 0.0) {
1528
+ aa = -aa;
1529
1529
  }
1530
- lightLocal = normalize(reflect(-viewLocal, ad));
1530
+ lightLocal = normalize(reflect(-viewLocal, aa));
1531
1531
  }
1532
1532
  `}
1533
- else if (bv < cdf[OPENPBR_LOBE_SPECULAR]) {
1534
- *aS = material.specularRoughness;
1535
- *bu = true;
1536
- *bn = select(
1533
+ else if (bl < cdf[OPENPBR_LOBE_SPECULAR]) {
1534
+ *aO = material.specularRoughness;
1535
+ *bk = true;
1536
+ *bh = select(
1537
1537
  u32(OPENPBR_LOBE_SPECULAR),
1538
1538
  u32(OPENPBR_LOBE_METAL),
1539
- bv < cdf[OPENPBR_LOBE_METAL]
1539
+ bl < cdf[OPENPBR_LOBE_METAL]
1540
1540
  );
1541
- let uP = bv < cdf[OPENPBR_LOBE_METAL];
1542
- let sN = (bv - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1543
- if (uP & (sN < prepared.metalMsProbability)) {
1544
- let z = cH;
1545
- let ex = sqrt(max(0.0, 1.0 - z * z));
1546
- let azimuth = TWOPI * fL;
1547
- lightLocal = vec3f(ex * cos(azimuth), ex * sin(azimuth), z);
1541
+ let uU = bl < cdf[OPENPBR_LOBE_METAL];
1542
+ let sK = (bl - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1543
+ if (uU & (sK < prepared.metalMsProbability)) {
1544
+ let z = cp;
1545
+ let dr = sqrt(max(0.0, 1.0 - z * z));
1546
+ let azimuth = TWOPI * fp;
1547
+ lightLocal = vec3f(dr * cos(azimuth), dr * sin(azimuth), z);
1548
1548
  }
1549
1549
  else {
1550
- var ad = aD(
1550
+ var aa = aA(
1551
1551
  viewLocal,
1552
1552
  vec2f(material.alphaX, material.alphaY),
1553
- vec2f(cH, fL)
1553
+ vec2f(cp, fp)
1554
1554
  );
1555
- if (ad.z < 0.0) {
1556
- ad = -ad;
1555
+ if (aa.z < 0.0) {
1556
+ aa = -aa;
1557
1557
  }
1558
- lightLocal = normalize(reflect(-viewLocal, ad));
1558
+ lightLocal = normalize(reflect(-viewLocal, aa));
1559
1559
  }
1560
1560
  }
1561
- else if (bv < cdf[OPENPBR_LOBE_TRANSMISSION]) {
1562
- *aS = material.specularRoughness;
1563
- *bu = true;
1561
+ else if (bl < cdf[OPENPBR_LOBE_TRANSMISSION]) {
1562
+ *aO = material.specularRoughness;
1563
+ *bk = true;
1564
1564
  *isTransmissionEvent = true;
1565
- *bn = u32(OPENPBR_LOBE_TRANSMISSION);
1565
+ *bh = u32(OPENPBR_LOBE_TRANSMISSION);
1566
1566
 
1567
1567
 
1568
- let vS = (bv - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1569
- if ((prepared.dielectricMsProbability > 0.0) & (vS < prepared.dielectricMsProbability)) {
1570
- let ju = prepared.dielectricMsReflectionRatio;
1571
- let mJ = cH < ju;
1568
+ let wk = (bl - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1569
+ if ((prepared.dielectricMsProbability > 0.0) & (wk < prepared.dielectricMsProbability)) {
1570
+ let iZ = prepared.dielectricMsReflectionRatio;
1571
+ let mv = cp < iZ;
1572
1572
  var z: f32;
1573
- if (mJ) { z = min(cH / ju, 0.99999994); }
1574
- else { z = -min((cH - ju) / (1.0 - ju), 0.99999994); }
1575
- let ex = sqrt(max(0.0, 1.0 - z * z));
1576
- let azimuth = TWOPI * fL;
1577
- lightLocal = vec3f(ex * cos(azimuth), ex * sin(azimuth), z);
1578
- *isTransmissionEvent = !mJ;
1579
- *bn = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), mJ);
1573
+ if (mv) { z = min(cp / iZ, 0.99999994); }
1574
+ else { z = -min((cp - iZ) / (1.0 - iZ), 0.99999994); }
1575
+ let dr = sqrt(max(0.0, 1.0 - z * z));
1576
+ let azimuth = TWOPI * fp;
1577
+ lightLocal = vec3f(dr * cos(azimuth), dr * sin(azimuth), z);
1578
+ *isTransmissionEvent = !mv;
1579
+ *bh = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), mv);
1580
1580
  }
1581
1581
  else {
1582
- var ad = aD(
1582
+ var aa = aA(
1583
1583
  viewLocal,
1584
1584
  vec2f(material.alphaX, material.alphaY),
1585
- vec2f(cH, fL)
1585
+ vec2f(cp, fp)
1586
1586
  );
1587
- if (ad.z < 0.0) {
1588
- ad = -ad;
1587
+ if (aa.z < 0.0) {
1588
+ aa = -aa;
1589
1589
  }
1590
1590
  if (material.thinWalled) {
1591
- let iC = normalize(reflect(-viewLocal, ad));
1592
- lightLocal = vec3f(iC.xy, -iC.z);
1591
+ let hX = normalize(reflect(-viewLocal, aa));
1592
+ lightLocal = vec3f(hX.xy, -hX.z);
1593
1593
  }
1594
1594
  else {
1595
1595
  lightLocal = refract(
1596
1596
  -viewLocal,
1597
- ad,
1597
+ aa,
1598
1598
  prepared.material.relativeIor
1599
1599
  );
1600
1600
  if (dot(lightLocal, lightLocal) <= 1e-8) {
@@ -1606,20 +1606,20 @@ lightLocal = normalize(lightLocal);
1606
1606
  }
1607
1607
  }
1608
1608
  else {
1609
- *aS = 1.0;
1610
- *cO = true;
1609
+ *aO = 1.0;
1610
+ *cC = true;
1611
1611
  *isTransmissionEvent = true;
1612
- *bn = u32(OPENPBR_LOBE_SUBSURFACE);
1612
+ *bh = u32(OPENPBR_LOBE_SUBSURFACE);
1613
1613
  if (material.thinWalled) {
1614
- let qL = cH >= 0.5;
1615
- if (qL) {
1616
- cH = (cH - 0.5) * 2.0;
1614
+ let qD = cp >= 0.5;
1615
+ if (qD) {
1616
+ cp = (cp - 0.5) * 2.0;
1617
1617
  }
1618
1618
  else {
1619
- cH *= 2.0;
1619
+ cp *= 2.0;
1620
1620
  }
1621
- lightLocal = aO(vec2f(cH, fL));
1622
- if (qL) {
1621
+ lightLocal = aM(vec2f(cp, fp));
1622
+ if (qD) {
1623
1623
  lightLocal.z = -lightLocal.z;
1624
1624
  }
1625
1625
  else {
@@ -1627,7 +1627,7 @@ else {
1627
1627
  }
1628
1628
  }
1629
1629
  else {
1630
- lightLocal = aO(vec2f(cH, fL));
1630
+ lightLocal = aM(vec2f(cp, fp));
1631
1631
  lightLocal.z = -lightLocal.z;
1632
1632
  }
1633
1633
  }
@@ -1646,22 +1646,22 @@ if (material.coatNormalEnabled &
1646
1646
  return true;
1647
1647
  }
1648
1648
 
1649
- fn eN(
1650
- prepared: ag,
1651
- cq: vec3f,
1649
+ fn dl(
1650
+ prepared: OpenPbrPreparedBsdf,
1651
+ cc: vec3f,
1652
1652
  lightDirection: ptr<function, vec3f>,
1653
1653
  pdf: ptr<function, f32>,
1654
1654
  isTransmissionEvent: ptr<function, bool>,
1655
- aS: ptr<function, f32>,
1656
- bu: ptr<function, bool>,
1657
- cO: ptr<function, bool>,
1658
- bn: ptr<function, u32>,
1659
- lW: ptr<function, f32>,
1660
- kq: ptr<function, vec3f>
1655
+ aO: ptr<function, f32>,
1656
+ bk: ptr<function, bool>,
1657
+ cC: ptr<function, bool>,
1658
+ bh: ptr<function, u32>,
1659
+ marginalPdf: ptr<function, f32>,
1660
+ jU: ptr<function, vec3f>
1661
1661
  ) -> vec3f {
1662
1662
  *pdf = 0.0;
1663
- *lW = 0.0;
1664
- *kq = vec3f(0.0);
1663
+ *marginalPdf = 0.0;
1664
+ *jU = vec3f(0.0);
1665
1665
 
1666
1666
 
1667
1667
 
@@ -1673,61 +1673,61 @@ if (!prepared.material.thinWalled &
1673
1673
  prepared.basis,
1674
1674
  -prepared.viewLocal
1675
1675
  );
1676
- let oF = bh(prepared.material)
1677
- * cF(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
1676
+ let ov = ba(prepared.material)
1677
+ * cm(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
1678
1678
  *pdf = 1.0;
1679
- *lW = 1.0;
1680
- *kq = oF;
1679
+ *marginalPdf = 1.0;
1680
+ *jU = ov;
1681
1681
  *isTransmissionEvent = true;
1682
- *aS = 0.0;
1683
- *bu = true;
1684
- *cO = false;
1685
- *bn = u32(OPENPBR_LOBE_TRANSMISSION);
1686
- return oF;
1687
- }
1688
- if (!jq(prepared, cq, lightDirection,
1689
- isTransmissionEvent, aS, bu,
1690
- cO, bn)) { return vec3f(0.0); }
1691
- let response = bO(prepared, *lightDirection, pdf);
1692
- *lW = *pdf;
1693
- *kq = response;
1682
+ *aO = 0.0;
1683
+ *bk = true;
1684
+ *cC = false;
1685
+ *bh = u32(OPENPBR_LOBE_TRANSMISSION);
1686
+ return ov;
1687
+ }
1688
+ if (!iW(prepared, cc, lightDirection,
1689
+ isTransmissionEvent, aO, bk,
1690
+ cC, bh)) { return vec3f(0.0); }
1691
+ let response = openpbr_eval_prepared(prepared, *lightDirection, pdf);
1692
+ *marginalPdf = *pdf;
1693
+ *jU = response;
1694
1694
  return response;
1695
1695
  }
1696
1696
 
1697
- fn tZ(
1697
+ fn uc(
1698
1698
  tangent: vec3f,
1699
1699
  material: OpenPbrResolvedMaterial,
1700
- cq: vec3f,
1701
- bM: vec3f,
1700
+ cc: vec3f,
1701
+ bD: vec3f,
1702
1702
  normal: vec3f,
1703
1703
  lightDirection: ptr<function, vec3f>,
1704
1704
  pdf: ptr<function, f32>,
1705
1705
  isTransmissionEvent: ptr<function, bool>,
1706
- aS: ptr<function, f32>,
1707
- bu: ptr<function, bool>,
1708
- cO: ptr<function, bool>,
1709
- bn: ptr<function, u32>,
1710
- lW: ptr<function, f32>
1706
+ aO: ptr<function, f32>,
1707
+ bk: ptr<function, bool>,
1708
+ cC: ptr<function, bool>,
1709
+ bh: ptr<function, u32>,
1710
+ marginalPdf: ptr<function, f32>
1711
1711
  ) -> vec3f {
1712
- let prepared = ds(
1712
+ let prepared = bV(
1713
1713
  tangent,
1714
1714
  material,
1715
- bM,
1715
+ bD,
1716
1716
  normal
1717
1717
  );
1718
- var kq = vec3f(0.0);
1719
- return eN(
1718
+ var jU = vec3f(0.0);
1719
+ return dl(
1720
1720
  prepared,
1721
- cq,
1721
+ cc,
1722
1722
  lightDirection,
1723
1723
  pdf,
1724
1724
  isTransmissionEvent,
1725
- aS,
1726
- bu,
1727
- cO,
1728
- bn,
1729
- lW,
1730
- &kq
1725
+ aO,
1726
+ bk,
1727
+ cC,
1728
+ bh,
1729
+ marginalPdf,
1730
+ &jU
1731
1731
  );
1732
1732
  }`;
1733
1733
  }