three-gpu-pathtracer 0.0.12 → 0.0.13

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 (53) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +961 -886
  3. package/build/index.module.js +6850 -6481
  4. package/build/index.module.js.map +1 -1
  5. package/build/index.umd.cjs +6845 -6475
  6. package/build/index.umd.cjs.map +1 -1
  7. package/package.json +73 -72
  8. package/src/core/DynamicPathTracingSceneGenerator.js +119 -119
  9. package/src/core/MaterialReducer.js +256 -256
  10. package/src/core/PathTracingRenderer.js +346 -275
  11. package/src/core/PathTracingSceneGenerator.js +69 -69
  12. package/src/core/QuiltPathTracingRenderer.js +223 -0
  13. package/src/index.js +40 -39
  14. package/src/materials/AlphaDisplayMaterial.js +48 -48
  15. package/src/materials/AmbientOcclusionMaterial.js +199 -199
  16. package/src/materials/BlendMaterial.js +67 -67
  17. package/src/materials/DenoiseMaterial.js +142 -142
  18. package/src/materials/GraphMaterial.js +243 -243
  19. package/src/materials/LambertPathTracingMaterial.js +285 -285
  20. package/src/materials/MaterialBase.js +56 -56
  21. package/src/materials/PhysicalPathTracingMaterial.js +1013 -982
  22. package/src/objects/EquirectCamera.js +13 -13
  23. package/src/objects/PhysicalCamera.js +28 -28
  24. package/src/objects/PhysicalSpotLight.js +14 -14
  25. package/src/objects/ShapedAreaLight.js +12 -12
  26. package/src/shader/shaderEnvMapSampling.js +58 -58
  27. package/src/shader/shaderGGXFunctions.js +100 -100
  28. package/src/shader/shaderIridescenceFunctions.js +135 -130
  29. package/src/shader/shaderLayerTexelFetchFunctions.js +25 -25
  30. package/src/shader/shaderLightSampling.js +229 -229
  31. package/src/shader/shaderMaterialSampling.js +510 -506
  32. package/src/shader/shaderRandFunctions.js +57 -57
  33. package/src/shader/shaderSheenFunctions.js +98 -98
  34. package/src/shader/shaderSobolSampling.js +256 -256
  35. package/src/shader/shaderStructs.js +327 -325
  36. package/src/shader/shaderUtils.js +377 -361
  37. package/src/textures/GradientEquirectTexture.js +35 -35
  38. package/src/textures/ProceduralEquirectTexture.js +75 -75
  39. package/src/uniforms/AttributesTextureArray.js +35 -35
  40. package/src/uniforms/EquirectHdrInfoUniform.js +273 -259
  41. package/src/uniforms/FloatAttributeTextureArray.js +169 -169
  42. package/src/uniforms/IESProfilesTexture.js +100 -100
  43. package/src/uniforms/LightsInfoUniformStruct.js +212 -207
  44. package/src/uniforms/MaterialsTexture.js +426 -426
  45. package/src/uniforms/PhysicalCameraUniform.js +36 -36
  46. package/src/uniforms/RenderTarget2DArray.js +97 -97
  47. package/src/uniforms/utils.js +30 -30
  48. package/src/utils/BlurredEnvMapGenerator.js +116 -116
  49. package/src/utils/GeometryPreparationUtils.js +214 -214
  50. package/src/utils/IESLoader.js +325 -325
  51. package/src/utils/SobolNumberMapGenerator.js +80 -80
  52. package/src/utils/UVUnwrapper.js +101 -101
  53. package/src/workers/PathTracingSceneWorker.js +42 -42
@@ -1,325 +1,327 @@
1
- export const shaderMaterialStructs = /* glsl */ `
2
-
3
- struct PhysicalCamera {
4
-
5
- float focusDistance;
6
- float anamorphicRatio;
7
- float bokehSize;
8
- int apertureBlades;
9
- float apertureRotation;
10
-
11
- };
12
-
13
- struct EquirectHdrInfo {
14
-
15
- sampler2D marginalWeights;
16
- sampler2D conditionalWeights;
17
- sampler2D map;
18
-
19
- float totalSumWhole;
20
- float totalSumDecimal;
21
-
22
- };
23
-
24
- struct Material {
25
-
26
- vec3 color;
27
- int map;
28
-
29
- float metalness;
30
- int metalnessMap;
31
-
32
- float roughness;
33
- int roughnessMap;
34
-
35
- float ior;
36
- float transmission;
37
- int transmissionMap;
38
-
39
- float emissiveIntensity;
40
- vec3 emissive;
41
- int emissiveMap;
42
-
43
- int normalMap;
44
- vec2 normalScale;
45
-
46
- float clearcoat;
47
- int clearcoatMap;
48
- int clearcoatNormalMap;
49
- vec2 clearcoatNormalScale;
50
- float clearcoatRoughness;
51
- int clearcoatRoughnessMap;
52
-
53
- int iridescenceMap;
54
- int iridescenceThicknessMap;
55
- float iridescence;
56
- float iridescenceIor;
57
- float iridescenceThicknessMinimum;
58
- float iridescenceThicknessMaximum;
59
-
60
- vec3 specularColor;
61
- int specularColorMap;
62
-
63
- float specularIntensity;
64
- int specularIntensityMap;
65
- bool thinFilm;
66
-
67
- vec3 attenuationColor;
68
- float attenuationDistance;
69
-
70
- int alphaMap;
71
-
72
- bool castShadow;
73
- float opacity;
74
- float alphaTest;
75
-
76
- float side;
77
- bool matte;
78
-
79
- vec3 sheenColor;
80
- int sheenColorMap;
81
- float sheenRoughness;
82
- int sheenRoughnessMap;
83
-
84
- bool vertexColors;
85
- bool flatShading;
86
- bool transparent;
87
-
88
- mat3 mapTransform;
89
- mat3 metalnessMapTransform;
90
- mat3 roughnessMapTransform;
91
- mat3 transmissionMapTransform;
92
- mat3 emissiveMapTransform;
93
- mat3 normalMapTransform;
94
- mat3 clearcoatMapTransform;
95
- mat3 clearcoatNormalMapTransform;
96
- mat3 clearcoatRoughnessMapTransform;
97
- mat3 sheenColorMapTransform;
98
- mat3 sheenRoughnessMapTransform;
99
- mat3 iridescenceMapTransform;
100
- mat3 iridescenceThicknessMapTransform;
101
- mat3 specularColorMapTransform;
102
- mat3 specularIntensityMapTransform;
103
-
104
- };
105
-
106
- mat3 readTextureTransform( sampler2D tex, uint index ) {
107
-
108
- mat3 textureTransform;
109
-
110
- vec4 row1 = texelFetch1D( tex, index );
111
- vec4 row2 = texelFetch1D( tex, index + 1u );
112
-
113
- textureTransform[0] = vec3(row1.r, row2.r, 0.0);
114
- textureTransform[1] = vec3(row1.g, row2.g, 0.0);
115
- textureTransform[2] = vec3(row1.b, row2.b, 1.0);
116
-
117
- return textureTransform;
118
-
119
- }
120
-
121
- Material readMaterialInfo( sampler2D tex, uint index ) {
122
-
123
- uint i = index * 45u;
124
-
125
- vec4 s0 = texelFetch1D( tex, i + 0u );
126
- vec4 s1 = texelFetch1D( tex, i + 1u );
127
- vec4 s2 = texelFetch1D( tex, i + 2u );
128
- vec4 s3 = texelFetch1D( tex, i + 3u );
129
- vec4 s4 = texelFetch1D( tex, i + 4u );
130
- vec4 s5 = texelFetch1D( tex, i + 5u );
131
- vec4 s6 = texelFetch1D( tex, i + 6u );
132
- vec4 s7 = texelFetch1D( tex, i + 7u );
133
- vec4 s8 = texelFetch1D( tex, i + 8u );
134
- vec4 s9 = texelFetch1D( tex, i + 9u );
135
- vec4 s10 = texelFetch1D( tex, i + 10u );
136
- vec4 s11 = texelFetch1D( tex, i + 11u );
137
- vec4 s12 = texelFetch1D( tex, i + 12u );
138
- vec4 s13 = texelFetch1D( tex, i + 13u );
139
- vec4 s14 = texelFetch1D( tex, i + 14u );
140
-
141
- Material m;
142
- m.color = s0.rgb;
143
- m.map = int( round( s0.a ) );
144
-
145
- m.metalness = s1.r;
146
- m.metalnessMap = int( round( s1.g ) );
147
- m.roughness = s1.b;
148
- m.roughnessMap = int( round( s1.a ) );
149
-
150
- m.ior = s2.r;
151
- m.transmission = s2.g;
152
- m.transmissionMap = int( round( s2.b ) );
153
- m.emissiveIntensity = s2.a;
154
-
155
- m.emissive = s3.rgb;
156
- m.emissiveMap = int( round( s3.a ) );
157
-
158
- m.normalMap = int( round( s4.r ) );
159
- m.normalScale = s4.gb;
160
-
161
- m.clearcoat = s4.a;
162
- m.clearcoatMap = int( round( s5.r ) );
163
- m.clearcoatRoughness = s5.g;
164
- m.clearcoatRoughnessMap = int( round( s5.b ) );
165
- m.clearcoatNormalMap = int( round( s5.a ) );
166
- m.clearcoatNormalScale = s6.rg;
167
-
168
- m.sheenColor = s7.rgb;
169
- m.sheenColorMap = int( round( s7.a ) );
170
- m.sheenRoughness = s8.r;
171
- m.sheenRoughnessMap = int( round( s8.g ) );
172
-
173
- m.iridescenceMap = int( round( s8.b ) );
174
- m.iridescenceThicknessMap = int( round( s8.a ) );
175
- m.iridescence = s9.r;
176
- m.iridescenceIor = s9.g;
177
- m.iridescenceThicknessMinimum = s9.b;
178
- m.iridescenceThicknessMaximum = s9.a;
179
-
180
- m.specularColor = s10.rgb;
181
- m.specularColorMap = int( round( s10.a ) );
182
-
183
- m.specularIntensity = s11.r;
184
- m.specularIntensityMap = int( round( s11.g ) );
185
- m.thinFilm = bool( s11.b );
186
-
187
- m.attenuationColor = s12.rgb;
188
- m.attenuationDistance = s12.a;
189
-
190
- m.alphaMap = int( round( s13.r ) );
191
-
192
- m.opacity = s13.g;
193
- m.alphaTest = s13.b;
194
- m.side = s13.a;
195
-
196
- m.matte = bool( s14.r );
197
- m.castShadow = ! bool( s14.g );
198
- m.vertexColors = bool( int( s14.b ) & 1 );
199
- m.flatShading = bool( int( s14.b ) & 2 );
200
- m.transparent = bool( s14.a );
201
-
202
- uint firstTextureTransformIdx = i + 15u;
203
-
204
- m.mapTransform = m.map == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx );
205
- m.metalnessMapTransform = m.metalnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 2u );
206
- m.roughnessMapTransform = m.roughnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 4u );
207
- m.transmissionMapTransform = m.transmissionMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 6u );
208
- m.emissiveMapTransform = m.emissiveMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 8u );
209
- m.normalMapTransform = m.normalMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 10u );
210
- m.clearcoatMapTransform = m.clearcoatMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 12u );
211
- m.clearcoatNormalMapTransform = m.clearcoatNormalMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 14u );
212
- m.clearcoatRoughnessMapTransform = m.clearcoatRoughnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 16u );
213
- m.sheenColorMapTransform = m.sheenColorMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 18u );
214
- m.sheenRoughnessMapTransform = m.sheenRoughnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 20u );
215
- m.iridescenceMapTransform = m.iridescenceMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 22u );
216
- m.iridescenceThicknessMapTransform = m.iridescenceThicknessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 24u );
217
- m.specularColorMapTransform = m.specularColorMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 26u );
218
- m.specularIntensityMapTransform = m.specularIntensityMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 28u );
219
-
220
- return m;
221
-
222
- }
223
-
224
- `;
225
-
226
- export const shaderLightStruct = /* glsl */ `
227
-
228
- #define RECT_AREA_LIGHT_TYPE 0
229
- #define CIRC_AREA_LIGHT_TYPE 1
230
- #define SPOT_LIGHT_TYPE 2
231
- #define DIR_LIGHT_TYPE 3
232
- #define POINT_LIGHT_TYPE 4
233
-
234
- struct LightsInfo {
235
-
236
- sampler2D tex;
237
- uint count;
238
-
239
- };
240
-
241
- struct Light {
242
-
243
- vec3 position;
244
- int type;
245
-
246
- vec3 color;
247
- float intensity;
248
-
249
- vec3 u;
250
- vec3 v;
251
- float area;
252
-
253
- // spot light fields
254
- float radius;
255
- float near;
256
- float decay;
257
- float distance;
258
- float coneCos;
259
- float penumbraCos;
260
- int iesProfile;
261
-
262
- };
263
-
264
- Light readLightInfo( sampler2D tex, uint index ) {
265
-
266
- uint i = index * 6u;
267
-
268
- vec4 s0 = texelFetch1D( tex, i + 0u );
269
- vec4 s1 = texelFetch1D( tex, i + 1u );
270
- vec4 s2 = texelFetch1D( tex, i + 2u );
271
- vec4 s3 = texelFetch1D( tex, i + 3u );
272
-
273
- Light l;
274
- l.position = s0.rgb;
275
- l.type = int( round( s0.a ) );
276
-
277
- l.color = s1.rgb;
278
- l.intensity = s1.a;
279
-
280
- l.u = s2.rgb;
281
- l.v = s3.rgb;
282
- l.area = s3.a;
283
-
284
- if ( l.type == SPOT_LIGHT_TYPE || l.type == POINT_LIGHT_TYPE ) {
285
-
286
- vec4 s4 = texelFetch1D( tex, i + 4u );
287
- vec4 s5 = texelFetch1D( tex, i + 5u );
288
- l.radius = s4.r;
289
- l.near = s4.g;
290
- l.decay = s4.b;
291
- l.distance = s4.a;
292
-
293
- l.coneCos = s5.r;
294
- l.penumbraCos = s5.g;
295
- l.iesProfile = int( round ( s5.b ) );
296
-
297
- }
298
-
299
- return l;
300
-
301
- }
302
-
303
- struct SpotLight {
304
-
305
- vec3 position;
306
- int type;
307
-
308
- vec3 color;
309
- float intensity;
310
-
311
- vec3 u;
312
- vec3 v;
313
- float area;
314
-
315
- float radius;
316
- float near;
317
- float decay;
318
- float distance;
319
- float coneCos;
320
- float penumbraCos;
321
- int iesProfile;
322
-
323
- };
324
-
325
- `;
1
+ export const shaderMaterialStructs = /* glsl */ `
2
+
3
+ struct PhysicalCamera {
4
+
5
+ float focusDistance;
6
+ float anamorphicRatio;
7
+ float bokehSize;
8
+ int apertureBlades;
9
+ float apertureRotation;
10
+
11
+ };
12
+
13
+ struct EquirectHdrInfo {
14
+
15
+ sampler2D marginalWeights;
16
+ sampler2D conditionalWeights;
17
+ sampler2D map;
18
+
19
+ float totalSumWhole;
20
+ float totalSumDecimal;
21
+
22
+ };
23
+
24
+ struct Material {
25
+
26
+ vec3 color;
27
+ int map;
28
+
29
+ float metalness;
30
+ int metalnessMap;
31
+
32
+ float roughness;
33
+ int roughnessMap;
34
+
35
+ float ior;
36
+ float transmission;
37
+ int transmissionMap;
38
+
39
+ float emissiveIntensity;
40
+ vec3 emissive;
41
+ int emissiveMap;
42
+
43
+ int normalMap;
44
+ vec2 normalScale;
45
+
46
+ float clearcoat;
47
+ int clearcoatMap;
48
+ int clearcoatNormalMap;
49
+ vec2 clearcoatNormalScale;
50
+ float clearcoatRoughness;
51
+ int clearcoatRoughnessMap;
52
+
53
+ int iridescenceMap;
54
+ int iridescenceThicknessMap;
55
+ float iridescence;
56
+ float iridescenceIor;
57
+ float iridescenceThicknessMinimum;
58
+ float iridescenceThicknessMaximum;
59
+
60
+ vec3 specularColor;
61
+ int specularColorMap;
62
+
63
+ float specularIntensity;
64
+ int specularIntensityMap;
65
+ bool thinFilm;
66
+
67
+ vec3 attenuationColor;
68
+ float attenuationDistance;
69
+
70
+ int alphaMap;
71
+
72
+ bool castShadow;
73
+ float opacity;
74
+ float alphaTest;
75
+
76
+ float side;
77
+ bool matte;
78
+
79
+ float sheen;
80
+ vec3 sheenColor;
81
+ int sheenColorMap;
82
+ float sheenRoughness;
83
+ int sheenRoughnessMap;
84
+
85
+ bool vertexColors;
86
+ bool flatShading;
87
+ bool transparent;
88
+
89
+ mat3 mapTransform;
90
+ mat3 metalnessMapTransform;
91
+ mat3 roughnessMapTransform;
92
+ mat3 transmissionMapTransform;
93
+ mat3 emissiveMapTransform;
94
+ mat3 normalMapTransform;
95
+ mat3 clearcoatMapTransform;
96
+ mat3 clearcoatNormalMapTransform;
97
+ mat3 clearcoatRoughnessMapTransform;
98
+ mat3 sheenColorMapTransform;
99
+ mat3 sheenRoughnessMapTransform;
100
+ mat3 iridescenceMapTransform;
101
+ mat3 iridescenceThicknessMapTransform;
102
+ mat3 specularColorMapTransform;
103
+ mat3 specularIntensityMapTransform;
104
+
105
+ };
106
+
107
+ mat3 readTextureTransform( sampler2D tex, uint index ) {
108
+
109
+ mat3 textureTransform;
110
+
111
+ vec4 row1 = texelFetch1D( tex, index );
112
+ vec4 row2 = texelFetch1D( tex, index + 1u );
113
+
114
+ textureTransform[0] = vec3(row1.r, row2.r, 0.0);
115
+ textureTransform[1] = vec3(row1.g, row2.g, 0.0);
116
+ textureTransform[2] = vec3(row1.b, row2.b, 1.0);
117
+
118
+ return textureTransform;
119
+
120
+ }
121
+
122
+ Material readMaterialInfo( sampler2D tex, uint index ) {
123
+
124
+ uint i = index * 45u;
125
+
126
+ vec4 s0 = texelFetch1D( tex, i + 0u );
127
+ vec4 s1 = texelFetch1D( tex, i + 1u );
128
+ vec4 s2 = texelFetch1D( tex, i + 2u );
129
+ vec4 s3 = texelFetch1D( tex, i + 3u );
130
+ vec4 s4 = texelFetch1D( tex, i + 4u );
131
+ vec4 s5 = texelFetch1D( tex, i + 5u );
132
+ vec4 s6 = texelFetch1D( tex, i + 6u );
133
+ vec4 s7 = texelFetch1D( tex, i + 7u );
134
+ vec4 s8 = texelFetch1D( tex, i + 8u );
135
+ vec4 s9 = texelFetch1D( tex, i + 9u );
136
+ vec4 s10 = texelFetch1D( tex, i + 10u );
137
+ vec4 s11 = texelFetch1D( tex, i + 11u );
138
+ vec4 s12 = texelFetch1D( tex, i + 12u );
139
+ vec4 s13 = texelFetch1D( tex, i + 13u );
140
+ vec4 s14 = texelFetch1D( tex, i + 14u );
141
+
142
+ Material m;
143
+ m.color = s0.rgb;
144
+ m.map = int( round( s0.a ) );
145
+
146
+ m.metalness = s1.r;
147
+ m.metalnessMap = int( round( s1.g ) );
148
+ m.roughness = s1.b;
149
+ m.roughnessMap = int( round( s1.a ) );
150
+
151
+ m.ior = s2.r;
152
+ m.transmission = s2.g;
153
+ m.transmissionMap = int( round( s2.b ) );
154
+ m.emissiveIntensity = s2.a;
155
+
156
+ m.emissive = s3.rgb;
157
+ m.emissiveMap = int( round( s3.a ) );
158
+
159
+ m.normalMap = int( round( s4.r ) );
160
+ m.normalScale = s4.gb;
161
+
162
+ m.clearcoat = s4.a;
163
+ m.clearcoatMap = int( round( s5.r ) );
164
+ m.clearcoatRoughness = s5.g;
165
+ m.clearcoatRoughnessMap = int( round( s5.b ) );
166
+ m.clearcoatNormalMap = int( round( s5.a ) );
167
+ m.clearcoatNormalScale = s6.rg;
168
+
169
+ m.sheen = s6.a;
170
+ m.sheenColor = s7.rgb;
171
+ m.sheenColorMap = int( round( s7.a ) );
172
+ m.sheenRoughness = s8.r;
173
+ m.sheenRoughnessMap = int( round( s8.g ) );
174
+
175
+ m.iridescenceMap = int( round( s8.b ) );
176
+ m.iridescenceThicknessMap = int( round( s8.a ) );
177
+ m.iridescence = s9.r;
178
+ m.iridescenceIor = s9.g;
179
+ m.iridescenceThicknessMinimum = s9.b;
180
+ m.iridescenceThicknessMaximum = s9.a;
181
+
182
+ m.specularColor = s10.rgb;
183
+ m.specularColorMap = int( round( s10.a ) );
184
+
185
+ m.specularIntensity = s11.r;
186
+ m.specularIntensityMap = int( round( s11.g ) );
187
+ m.thinFilm = bool( s11.b );
188
+
189
+ m.attenuationColor = s12.rgb;
190
+ m.attenuationDistance = s12.a;
191
+
192
+ m.alphaMap = int( round( s13.r ) );
193
+
194
+ m.opacity = s13.g;
195
+ m.alphaTest = s13.b;
196
+ m.side = s13.a;
197
+
198
+ m.matte = bool( s14.r );
199
+ m.castShadow = ! bool( s14.g );
200
+ m.vertexColors = bool( int( s14.b ) & 1 );
201
+ m.flatShading = bool( int( s14.b ) & 2 );
202
+ m.transparent = bool( s14.a );
203
+
204
+ uint firstTextureTransformIdx = i + 15u;
205
+
206
+ m.mapTransform = m.map == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx );
207
+ m.metalnessMapTransform = m.metalnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 2u );
208
+ m.roughnessMapTransform = m.roughnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 4u );
209
+ m.transmissionMapTransform = m.transmissionMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 6u );
210
+ m.emissiveMapTransform = m.emissiveMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 8u );
211
+ m.normalMapTransform = m.normalMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 10u );
212
+ m.clearcoatMapTransform = m.clearcoatMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 12u );
213
+ m.clearcoatNormalMapTransform = m.clearcoatNormalMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 14u );
214
+ m.clearcoatRoughnessMapTransform = m.clearcoatRoughnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 16u );
215
+ m.sheenColorMapTransform = m.sheenColorMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 18u );
216
+ m.sheenRoughnessMapTransform = m.sheenRoughnessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 20u );
217
+ m.iridescenceMapTransform = m.iridescenceMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 22u );
218
+ m.iridescenceThicknessMapTransform = m.iridescenceThicknessMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 24u );
219
+ m.specularColorMapTransform = m.specularColorMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 26u );
220
+ m.specularIntensityMapTransform = m.specularIntensityMap == - 1 ? mat3( 0 ) : readTextureTransform( tex, firstTextureTransformIdx + 28u );
221
+
222
+ return m;
223
+
224
+ }
225
+
226
+ `;
227
+
228
+ export const shaderLightStruct = /* glsl */ `
229
+
230
+ #define RECT_AREA_LIGHT_TYPE 0
231
+ #define CIRC_AREA_LIGHT_TYPE 1
232
+ #define SPOT_LIGHT_TYPE 2
233
+ #define DIR_LIGHT_TYPE 3
234
+ #define POINT_LIGHT_TYPE 4
235
+
236
+ struct LightsInfo {
237
+
238
+ sampler2D tex;
239
+ uint count;
240
+
241
+ };
242
+
243
+ struct Light {
244
+
245
+ vec3 position;
246
+ int type;
247
+
248
+ vec3 color;
249
+ float intensity;
250
+
251
+ vec3 u;
252
+ vec3 v;
253
+ float area;
254
+
255
+ // spot light fields
256
+ float radius;
257
+ float near;
258
+ float decay;
259
+ float distance;
260
+ float coneCos;
261
+ float penumbraCos;
262
+ int iesProfile;
263
+
264
+ };
265
+
266
+ Light readLightInfo( sampler2D tex, uint index ) {
267
+
268
+ uint i = index * 6u;
269
+
270
+ vec4 s0 = texelFetch1D( tex, i + 0u );
271
+ vec4 s1 = texelFetch1D( tex, i + 1u );
272
+ vec4 s2 = texelFetch1D( tex, i + 2u );
273
+ vec4 s3 = texelFetch1D( tex, i + 3u );
274
+
275
+ Light l;
276
+ l.position = s0.rgb;
277
+ l.type = int( round( s0.a ) );
278
+
279
+ l.color = s1.rgb;
280
+ l.intensity = s1.a;
281
+
282
+ l.u = s2.rgb;
283
+ l.v = s3.rgb;
284
+ l.area = s3.a;
285
+
286
+ if ( l.type == SPOT_LIGHT_TYPE || l.type == POINT_LIGHT_TYPE ) {
287
+
288
+ vec4 s4 = texelFetch1D( tex, i + 4u );
289
+ vec4 s5 = texelFetch1D( tex, i + 5u );
290
+ l.radius = s4.r;
291
+ l.near = s4.g;
292
+ l.decay = s4.b;
293
+ l.distance = s4.a;
294
+
295
+ l.coneCos = s5.r;
296
+ l.penumbraCos = s5.g;
297
+ l.iesProfile = int( round ( s5.b ) );
298
+
299
+ }
300
+
301
+ return l;
302
+
303
+ }
304
+
305
+ struct SpotLight {
306
+
307
+ vec3 position;
308
+ int type;
309
+
310
+ vec3 color;
311
+ float intensity;
312
+
313
+ vec3 u;
314
+ vec3 v;
315
+ float area;
316
+
317
+ float radius;
318
+ float near;
319
+ float decay;
320
+ float distance;
321
+ float coneCos;
322
+ float penumbraCos;
323
+ int iesProfile;
324
+
325
+ };
326
+
327
+ `;