@meimu/mutracer 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +1425 -1421
- package/docs/api.md +2 -1
- package/docs/materials.md +17 -26
- package/docs/threejs.md +5 -5
- package/docs/viewer.md +36 -3
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
- package/lib/renderer/WGPURayTraceOutput.js +4 -4
- package/lib/renderer/WGPURayTracePass.js +5 -3
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +7 -7
- package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
- package/lib/renderer/WebGLRayTracePass.js +1 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
- package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
- package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/rayTrace.frag.js +67 -67
- package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
- package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
- package/lib/renderer/scratchSampling.js +16 -16
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
- package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
- package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,12 +12,12 @@ int triangleIndex = primitiveOffset + k;
|
|
|
12
12
|
${skipTriangleCode}
|
|
13
13
|
vec4 r3 = dp(triangleIndex);
|
|
14
14
|
ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
|
|
15
|
-
|
|
15
|
+
fB tri = fB(
|
|
16
16
|
kG(positionBuffer, index.x, vertexColumns).xyz,
|
|
17
17
|
kG(positionBuffer, index.y, vertexColumns).xyz,
|
|
18
18
|
kG(positionBuffer, index.z, vertexColumns).xyz
|
|
19
19
|
);
|
|
20
|
-
eC hit =
|
|
20
|
+
eC hit = fM(o, d, tri, ey, gQ, tMax);
|
|
21
21
|
|
|
22
22
|
if (hit.t > 0.0) {
|
|
23
23
|
tMax = hit.t;
|
|
@@ -52,7 +52,7 @@ vec3 hB;
|
|
|
52
52
|
vec3 aB;
|
|
53
53
|
ivec3 hw;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
fB lB;
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
top = 0;
|
|
@@ -81,18 +81,18 @@ o = (w2l * vec4(ray.o, 1.0)).xyz;
|
|
|
81
81
|
d = (w2l * vec4(ray.d, 0.0)).xyz;
|
|
82
82
|
}
|
|
83
83
|
ey = maxDimension(abs(d));
|
|
84
|
-
|
|
84
|
+
gQ = mu(d, ey);
|
|
85
85
|
sO = cf;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
int bo = cf < 0 ? 0 : blasOffset;
|
|
89
|
-
uint
|
|
90
|
-
int
|
|
91
|
-
int eW = int(
|
|
89
|
+
uint fK = cf < 0 ? 0u : floatBitsToUint(bv(cf * ${INSTANCE_VEC4_STRIDE}).x);
|
|
90
|
+
int gS = int(fK >> 30u);
|
|
91
|
+
int eW = int(fK & 0x3fffffffu);
|
|
92
92
|
int bh = 0;
|
|
93
93
|
int primitiveOffset = 0;
|
|
94
94
|
|
|
95
|
-
if (
|
|
95
|
+
if (gS == 3) {
|
|
96
96
|
uint hW = uint(node.x);
|
|
97
97
|
if ((hW & 0x80000000u) != 0u) {
|
|
98
98
|
bh = int((hW >> 23u) & 0xffu);
|
|
@@ -101,10 +101,10 @@ primitiveOffset = bo + eW + int(hW & 0x007fffffu);
|
|
|
101
101
|
else {
|
|
102
102
|
int i = node.x + bo;
|
|
103
103
|
vec4 jA = dp(i);
|
|
104
|
-
vec4
|
|
105
|
-
vec4
|
|
106
|
-
vec4
|
|
107
|
-
vec4
|
|
104
|
+
vec4 fG = dp(i + 1);
|
|
105
|
+
vec4 mU = dp(i + 2);
|
|
106
|
+
vec4 mV = dp(i + 3);
|
|
107
|
+
vec4 mW = dp(i + 4);
|
|
108
108
|
uint header = floatBitsToUint(jA.w);
|
|
109
109
|
int rG = int(header << 24u) >> 24;
|
|
110
110
|
int rH = int((header >> 8u) << 24u) >> 24;
|
|
@@ -114,54 +114,54 @@ uintBitsToFloat(uint(rG + 127) << 23u),
|
|
|
114
114
|
uintBitsToFloat(uint(rH + 127) << 23u),
|
|
115
115
|
uintBitsToFloat(uint(rI + 127) << 23u)
|
|
116
116
|
);
|
|
117
|
-
uint childBase = floatBitsToUint(
|
|
118
|
-
uint
|
|
117
|
+
uint childBase = floatBitsToUint(fG.x);
|
|
118
|
+
uint oP = floatBitsToUint(fG.y);
|
|
119
119
|
uint internalMask = header >> 24u;
|
|
120
120
|
uint ut = (d.x < 0.0 ? 4u : 0u) |
|
|
121
121
|
(d.y < 0.0 ? 2u : 0u) |
|
|
122
122
|
(d.z < 0.0 ? 1u : 0u);
|
|
123
|
-
uint
|
|
123
|
+
uint gJ[12] = uint[12](
|
|
124
|
+
floatBitsToUint(mU.x), floatBitsToUint(mU.y),
|
|
125
|
+
floatBitsToUint(mU.z), floatBitsToUint(mU.w),
|
|
124
126
|
floatBitsToUint(mV.x), floatBitsToUint(mV.y),
|
|
125
127
|
floatBitsToUint(mV.z), floatBitsToUint(mV.w),
|
|
126
128
|
floatBitsToUint(mW.x), floatBitsToUint(mW.y),
|
|
127
|
-
floatBitsToUint(mW.z), floatBitsToUint(mW.w)
|
|
128
|
-
floatBitsToUint(mX.x), floatBitsToUint(mX.y),
|
|
129
|
-
floatBitsToUint(mX.z), floatBitsToUint(mX.w)
|
|
129
|
+
floatBitsToUint(mW.z), floatBitsToUint(mW.w)
|
|
130
130
|
);
|
|
131
131
|
|
|
132
132
|
for (int order = 7; order >= 0; order--) {
|
|
133
133
|
uint slot = uint(order) ^ ut;
|
|
134
134
|
uint sE = slot >= 4u
|
|
135
|
-
? floatBitsToUint(
|
|
136
|
-
: floatBitsToUint(
|
|
135
|
+
? floatBitsToUint(fG.w)
|
|
136
|
+
: floatBitsToUint(fG.z);
|
|
137
137
|
uint meta = (sE >> ((slot & 3u) * 8u)) & 0xffu;
|
|
138
138
|
if (meta == 0u) continue;
|
|
139
|
-
uint
|
|
139
|
+
uint lX = (slot & 3u) * 8u;
|
|
140
140
|
uint kV = slot >> 2u;
|
|
141
141
|
vec3 tH = vec3(
|
|
142
|
-
float((
|
|
143
|
-
float((
|
|
144
|
-
float((
|
|
142
|
+
float((gJ[kV] >> lX) & 0xffu),
|
|
143
|
+
float((gJ[2u + kV] >> lX) & 0xffu),
|
|
144
|
+
float((gJ[4u + kV] >> lX) & 0xffu)
|
|
145
145
|
);
|
|
146
146
|
vec3 tG = vec3(
|
|
147
|
-
float((
|
|
148
|
-
float((
|
|
149
|
-
float((
|
|
147
|
+
float((gJ[6u + kV] >> lX) & 0xffu),
|
|
148
|
+
float((gJ[8u + kV] >> lX) & 0xffu),
|
|
149
|
+
float((gJ[10u + kV] >> lX) & 0xffu)
|
|
150
150
|
);
|
|
151
151
|
vec3 uW = jA.xyz + tH * hJ;
|
|
152
152
|
vec3 uV = jA.xyz + tG * hJ;
|
|
153
153
|
if (cM(o, d, uW, uV, tMax) <= 0.0) continue;
|
|
154
154
|
uint jC = meta & 0x1fu;
|
|
155
155
|
if (jC >= 24u) {
|
|
156
|
-
uint
|
|
157
|
-
uint sX = childBase + qT(
|
|
156
|
+
uint nr = internalMask & ((1u << slot) - 1u);
|
|
157
|
+
uint sX = childBase + qT(nr);
|
|
158
158
|
stack[++top] = ivec2(
|
|
159
159
|
eW + int(sX * 5u), cf
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
163
|
uint triangleCount = qT(meta >> 5u);
|
|
164
|
-
uint rS =
|
|
164
|
+
uint rS = oP + jC;
|
|
165
165
|
uint vh = 0x80000000u |
|
|
166
166
|
(triangleCount << 23u) |
|
|
167
167
|
(rS & 0x007fffffu);
|
|
@@ -170,7 +170,7 @@ stack[++top] = ivec2(int(vh), cf);
|
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
else if (
|
|
173
|
+
else if (gS == 2) {
|
|
174
174
|
int i = node.x + bo;
|
|
175
175
|
vec4 uY = dp(i);
|
|
176
176
|
vec4 uZ = dp(i + 1);
|
|
@@ -195,7 +195,7 @@ if (d0 > 0.0) stack[++top] = ivec2(left, cf);
|
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
-
else if (
|
|
198
|
+
else if (gS == 1) {
|
|
199
199
|
uint hW = uint(node.x);
|
|
200
200
|
if ((hW & 0x80000000u) != 0u) {
|
|
201
201
|
bh = int((hW >> 23u) & 0xffu);
|
|
@@ -209,7 +209,7 @@ vec4 rp = dp(i + 2);
|
|
|
209
209
|
vec4 rq = dp(i + 3);
|
|
210
210
|
vec3 nodeMin = ui.xyz;
|
|
211
211
|
vec3 ec = vec3(ui.w, ro.x, ro.y);
|
|
212
|
-
uint
|
|
212
|
+
uint mg[4] = uint[4](
|
|
213
213
|
floatBitsToUint(ro.z), floatBitsToUint(ro.w),
|
|
214
214
|
floatBitsToUint(rp.x), floatBitsToUint(rp.y)
|
|
215
215
|
);
|
|
@@ -219,18 +219,18 @@ vec4 rB = fc(floatBitsToUint(rq.x));
|
|
|
219
219
|
vec4 rt = fc(floatBitsToUint(rq.y));
|
|
220
220
|
vec4 ru = fc(floatBitsToUint(rq.z));
|
|
221
221
|
vec4 rv = fc(floatBitsToUint(rq.w));
|
|
222
|
-
vec3
|
|
223
|
-
vec3 bJ = eZ(
|
|
224
|
-
vec4 tx0 = (nodeMin.x + rw * ec.x - o.x) *
|
|
225
|
-
vec4 tx1 = (nodeMin.x + rt * ec.x - o.x) *
|
|
226
|
-
vec4 ty0 = (nodeMin.y + rA * ec.y - o.y) *
|
|
227
|
-
vec4 ty1 = (nodeMin.y + ru * ec.y - o.y) *
|
|
228
|
-
vec4 tz0 = (nodeMin.z + rB * ec.z - o.z) *
|
|
229
|
-
vec4 tz1 = (nodeMin.z + rv * ec.z - o.z) *
|
|
230
|
-
vec4
|
|
222
|
+
vec3 gE = fb(d);
|
|
223
|
+
vec3 bJ = eZ(gE, o);
|
|
224
|
+
vec4 tx0 = (nodeMin.x + rw * ec.x - o.x) * gE.x;
|
|
225
|
+
vec4 tx1 = (nodeMin.x + rt * ec.x - o.x) * gE.x;
|
|
226
|
+
vec4 ty0 = (nodeMin.y + rA * ec.y - o.y) * gE.y;
|
|
227
|
+
vec4 ty1 = (nodeMin.y + ru * ec.y - o.y) * gE.y;
|
|
228
|
+
vec4 tz0 = (nodeMin.z + rB * ec.z - o.z) * gE.z;
|
|
229
|
+
vec4 tz1 = (nodeMin.z + rv * ec.z - o.z) * gE.z;
|
|
230
|
+
vec4 mK = max(max((min(tx0, tx1) - vec4(bJ.x)), (min(ty0, ty1) - vec4(bJ.y))), (min(tz0, tz1) - vec4(bJ.z)));
|
|
231
231
|
vec4 rU = min(min((max(tx0, tx1) + vec4(bJ.x)), (max(ty0, ty1) + vec4(bJ.y))), (max(tz0, tz1) + vec4(bJ.z)));
|
|
232
|
-
vec4 distance = mix(rU,
|
|
233
|
-
distance = mix(distance, vec4(-1.0), greaterThan(
|
|
232
|
+
vec4 distance = mix(rU, mK, greaterThan(mK, vec4(0.0)));
|
|
233
|
+
distance = mix(distance, vec4(-1.0), greaterThan(mK, min(rU, vec4(tMax))));
|
|
234
234
|
float fd[4] = float[4](distance.x, distance.y, distance.z, distance.w);
|
|
235
235
|
|
|
236
236
|
|
|
@@ -238,15 +238,15 @@ for (int order = 0; order < 4; order++) {
|
|
|
238
238
|
float dX = -1.0;
|
|
239
239
|
int el = -1;
|
|
240
240
|
for (int child = 0; child < 4; child++) {
|
|
241
|
-
if (
|
|
241
|
+
if (mg[child] != 0u && fd[child] > dX) {
|
|
242
242
|
dX = fd[child];
|
|
243
243
|
el = child;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
if (el >= 0 && dX > 0.0) {
|
|
247
|
-
uint
|
|
248
|
-
int jI = int(
|
|
249
|
-
if ((
|
|
247
|
+
uint nC = mg[el];
|
|
248
|
+
int jI = int(nC);
|
|
249
|
+
if ((nC & 0x80000000u) == 0u) {
|
|
250
250
|
jI += eW;
|
|
251
251
|
}
|
|
252
252
|
stack[++top] = ivec2(jI, cf);
|
|
@@ -321,7 +321,7 @@ export default createShaderMixin({
|
|
|
321
321
|
},
|
|
322
322
|
main: glsl `
|
|
323
323
|
|
|
324
|
-
struct
|
|
324
|
+
struct fB {
|
|
325
325
|
vec3 p0;
|
|
326
326
|
vec3 p1;
|
|
327
327
|
vec3 p2;
|
|
@@ -347,7 +347,7 @@ return t2;
|
|
|
347
347
|
return INF;
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
float
|
|
350
|
+
float nh(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
|
|
351
351
|
float dt = dot(r.d, n);
|
|
352
352
|
float t = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
353
353
|
|
|
@@ -366,7 +366,7 @@ return t;
|
|
|
366
366
|
return INF;
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
float
|
|
369
|
+
float my(Ray r, Light light, out LightSampleRec lightSample) {
|
|
370
370
|
|
|
371
371
|
|
|
372
372
|
|
|
@@ -383,7 +383,7 @@ vec3 normal = normalize(cross(u, v));
|
|
|
383
383
|
if (dot(normal, r.d) > 0.)
|
|
384
384
|
return INF;
|
|
385
385
|
|
|
386
|
-
d =
|
|
386
|
+
d = nh(pos, u, v, normal, r);
|
|
387
387
|
if (d < 0.) {
|
|
388
388
|
d = INF;
|
|
389
389
|
}
|
|
@@ -452,8 +452,8 @@ lightSample.isDelta = false;
|
|
|
452
452
|
}
|
|
453
453
|
if (d != INF) {
|
|
454
454
|
vec3 ve = r.o + d * r.d;
|
|
455
|
-
float
|
|
456
|
-
if (
|
|
455
|
+
float mB = bL(light, normalize(r.o - ve));
|
|
456
|
+
if (mB <= 0.0) return INF;
|
|
457
457
|
float aj = distance(r.o, light.position);
|
|
458
458
|
float cosThetaMax = aj <= light.radius
|
|
459
459
|
? -1.0
|
|
@@ -463,7 +463,7 @@ lightSample.pdf = aj <= light.radius
|
|
|
463
463
|
? INV4PI
|
|
464
464
|
: 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
465
465
|
}
|
|
466
|
-
lightSample.emission = light.emission *
|
|
466
|
+
lightSample.emission = light.emission * mB * (light.radius <= 0.0
|
|
467
467
|
? 1.0 / max(d * d, 1e-8)
|
|
468
468
|
: 1.0);
|
|
469
469
|
}
|
|
@@ -507,42 +507,42 @@ w21 = w21 / hk + w20;
|
|
|
507
507
|
w22 = w22 / hk + w21;
|
|
508
508
|
|
|
509
509
|
float rand = eo(0u);
|
|
510
|
-
float
|
|
510
|
+
float ni;
|
|
511
511
|
if (rand < w00) {
|
|
512
|
-
|
|
512
|
+
ni = m00.x;
|
|
513
513
|
} else if (rand < w01) {
|
|
514
|
-
|
|
514
|
+
ni = m01.x;
|
|
515
515
|
} else if (rand < w02) {
|
|
516
|
-
|
|
516
|
+
ni = m02.x;
|
|
517
517
|
} else if (rand < w10) {
|
|
518
|
-
|
|
518
|
+
ni = m10.x;
|
|
519
519
|
} else if (rand < w11) {
|
|
520
|
-
|
|
520
|
+
ni = m11.x;
|
|
521
521
|
} else if (rand < w12) {
|
|
522
|
-
|
|
522
|
+
ni = m12.x;
|
|
523
523
|
} else if (rand < w20) {
|
|
524
|
-
|
|
524
|
+
ni = m20.x;
|
|
525
525
|
} else if (rand < w21) {
|
|
526
|
-
|
|
526
|
+
ni = m21.x;
|
|
527
527
|
} else {
|
|
528
|
-
|
|
528
|
+
ni = m22.x;
|
|
529
529
|
}
|
|
530
|
-
return int(
|
|
530
|
+
return int(ni);
|
|
531
531
|
}
|
|
532
532
|
|
|
533
533
|
|
|
534
534
|
vec4 bv(int i);
|
|
535
535
|
|
|
536
536
|
|
|
537
|
-
mat2x3 eE(vec3 normal, vec3 dp1, vec3 dp2, vec2
|
|
538
|
-
float determinant =
|
|
537
|
+
mat2x3 eE(vec3 normal, vec3 dp1, vec3 dp2, vec2 oc, vec2 od, vec4 aT) {
|
|
538
|
+
float determinant = oc.x * od.y - oc.y * od.x;
|
|
539
539
|
vec3 t = aT.xyz;
|
|
540
540
|
vec3 b = vec3(0.0);
|
|
541
541
|
|
|
542
542
|
float qC = abs(aT.w) > 1.5 ? 0.0 : aT.w;
|
|
543
543
|
if (abs(determinant) > 1e-12) {
|
|
544
|
-
vec3 dt = (dp1 *
|
|
545
|
-
vec3 db = (dp2 *
|
|
544
|
+
vec3 dt = (dp1 * od.y - dp2 * oc.y) / determinant;
|
|
545
|
+
vec3 db = (dp2 * oc.x - dp1 * od.x) / determinant;
|
|
546
546
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
547
547
|
if (qC == 0.0) { qC = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
|
|
548
548
|
}
|
|
@@ -558,12 +558,12 @@ else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
|
558
558
|
return mat2x3(t, b * (qC < 0.0 ? -1.0 : 1.0));
|
|
559
559
|
}
|
|
560
560
|
|
|
561
|
-
void ht(inout ad si,
|
|
561
|
+
void ht(inout ad si, fB tri, vec3 barycentric, ivec3 index) {
|
|
562
562
|
si.hit = true;
|
|
563
563
|
si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
564
|
-
ivec2 i0 =
|
|
565
|
-
ivec2 i1 =
|
|
566
|
-
ivec2 i2 =
|
|
564
|
+
ivec2 i0 = gR(index.x, vertexColumns);
|
|
565
|
+
ivec2 i1 = gR(index.y, vertexColumns);
|
|
566
|
+
ivec2 i2 = gR(index.z, vertexColumns);
|
|
567
567
|
si.vertexColor = vec3(1.0);
|
|
568
568
|
#ifdef USE_VERTEX_COLOR
|
|
569
569
|
si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
|
|
@@ -630,29 +630,31 @@ vec2 cX = barycentric.x * secondaryUv0
|
|
|
630
630
|
+ barycentric.y * secondaryUv1
|
|
631
631
|
+ barycentric.z * secondaryUv2;
|
|
632
632
|
|
|
633
|
-
vec4
|
|
634
|
-
int uvProjection = int(
|
|
633
|
+
vec4 lL = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
|
|
634
|
+
int uvProjection = int(lL.r);
|
|
635
635
|
if (uvProjection > 0) {
|
|
636
|
-
uv =
|
|
636
|
+
uv = gI(uvProjection, si.position, normal, lL.zw);
|
|
637
637
|
cX = uv;
|
|
638
638
|
} else {
|
|
639
|
-
uv *=
|
|
640
|
-
cX *=
|
|
639
|
+
uv *= lL.zw;
|
|
640
|
+
cX *= lL.zw;
|
|
641
641
|
}
|
|
642
642
|
#else
|
|
643
643
|
vec2 uv = vec2(0.0);
|
|
644
644
|
vec2 cX = vec2(0.0);
|
|
645
645
|
#endif
|
|
646
646
|
|
|
647
|
-
#ifdef
|
|
647
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
648
648
|
si.coatNormal = normal;
|
|
649
|
-
|
|
649
|
+
#ifdef NUM_COAT_NORMAL_MAPS
|
|
650
|
+
float oU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
|
|
651
|
+
#endif
|
|
650
652
|
#endif
|
|
651
653
|
vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
|
|
652
654
|
float tm = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
|
|
653
655
|
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || tm != 0.0
|
|
654
|
-
#ifdef
|
|
655
|
-
||
|
|
656
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
657
|
+
|| fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
|
|
656
658
|
#endif
|
|
657
659
|
) {
|
|
658
660
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
@@ -666,31 +668,31 @@ aT = barycentric.x * texelFetch(tangentBuffer, i0, 0)
|
|
|
666
668
|
mat2x3 eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
667
669
|
si.geometryTangent = eS[0];
|
|
668
670
|
si.geometryBitangent = eS[1];
|
|
669
|
-
mat2x3
|
|
671
|
+
mat2x3 fZ = eS;
|
|
670
672
|
#ifdef NUM_ANISOTROPY_MAPS
|
|
671
673
|
if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
|
|
672
674
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
673
675
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
674
676
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
675
|
-
|
|
677
|
+
fZ = eE(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
|
|
676
678
|
}
|
|
677
679
|
#endif
|
|
678
|
-
si.directionTangent =
|
|
679
|
-
si.directionBitangent =
|
|
680
|
-
#
|
|
681
|
-
if (
|
|
682
|
-
int kC = int(
|
|
683
|
-
mat2x3
|
|
680
|
+
si.directionTangent = fZ[0];
|
|
681
|
+
si.directionBitangent = fZ[1];
|
|
682
|
+
#if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
|
|
683
|
+
if (oU >= 0.0) {
|
|
684
|
+
int kC = int(oU);
|
|
685
|
+
mat2x3 mh = eS;
|
|
684
686
|
if (mapUvChannel[kC] > 0.5) {
|
|
685
687
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
686
688
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
687
689
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
688
|
-
|
|
690
|
+
mh = eE(normal, dp1, dp2, a-c, b-c,
|
|
689
691
|
aT.w == 0.0 ? vec4(0.0) : aT);
|
|
690
692
|
}
|
|
691
693
|
vec3 decoded = sampleMap(kC, getMapUvSet(kC, uv, cX)).rgb * 2.0 - 1.0;
|
|
692
|
-
vec3 mapped =
|
|
693
|
-
+
|
|
694
|
+
vec3 mapped = mh[0] * decoded.x * directionMaterial.z
|
|
695
|
+
+ mh[1] * decoded.y * directionMaterial.w + normal * decoded.z;
|
|
694
696
|
if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
|
|
695
697
|
}
|
|
696
698
|
#endif
|
|
@@ -708,10 +710,10 @@ si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z *
|
|
|
708
710
|
#if defined(NUM_NORMAL_MAPS)
|
|
709
711
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
710
712
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
711
|
-
vec2
|
|
712
|
-
vec2
|
|
713
|
-
si.normal =
|
|
714
|
-
si.materialIndex, uv, normal, dp1, dp2,
|
|
713
|
+
vec2 oc = uv0 - uv2;
|
|
714
|
+
vec2 od = uv1 - uv2;
|
|
715
|
+
si.normal = ol(
|
|
716
|
+
si.materialIndex, uv, normal, dp1, dp2, oc, od
|
|
715
717
|
);
|
|
716
718
|
#else
|
|
717
719
|
si.normal = normal;
|
|
@@ -740,19 +742,19 @@ value = (value + (value >> 4u)) & 0x0f0f0f0fu;
|
|
|
740
742
|
return (value * 0x01010101u) >> 24u;
|
|
741
743
|
}
|
|
742
744
|
|
|
743
|
-
vec4 fc(uint
|
|
745
|
+
vec4 fc(uint lU) {
|
|
744
746
|
return vec4(
|
|
745
|
-
float(
|
|
746
|
-
float((
|
|
747
|
-
float((
|
|
748
|
-
float(
|
|
747
|
+
float(lU & 0xffu),
|
|
748
|
+
float((lU >> 8u) & 0xffu),
|
|
749
|
+
float((lU >> 16u) & 0xffu),
|
|
750
|
+
float(lU >> 24u)
|
|
749
751
|
) / 255.0;
|
|
750
752
|
}
|
|
751
753
|
|
|
752
754
|
|
|
753
755
|
|
|
754
756
|
|
|
755
|
-
eC
|
|
757
|
+
eC fM(vec3 o, vec3 d, fB tri, int ey, vec3 gQ, float tMax) {
|
|
756
758
|
eC ti;
|
|
757
759
|
|
|
758
760
|
|
|
@@ -772,9 +774,9 @@ p2t = p2t.zxy;
|
|
|
772
774
|
}
|
|
773
775
|
|
|
774
776
|
|
|
775
|
-
p0t.xy +=
|
|
776
|
-
p1t.xy +=
|
|
777
|
-
p2t.xy +=
|
|
777
|
+
p0t.xy += gQ.xy * p0t.z;
|
|
778
|
+
p1t.xy += gQ.xy * p1t.z;
|
|
779
|
+
p2t.xy += gQ.xy * p2t.z;
|
|
778
780
|
|
|
779
781
|
|
|
780
782
|
vec3 e = vec3(
|
|
@@ -799,9 +801,9 @@ float det = e.x + e.y + e.z;
|
|
|
799
801
|
if (det == 0.0) return ti;
|
|
800
802
|
#endif
|
|
801
803
|
|
|
802
|
-
p0t.z *=
|
|
803
|
-
p1t.z *=
|
|
804
|
-
p2t.z *=
|
|
804
|
+
p0t.z *= gQ.z;
|
|
805
|
+
p1t.z *= gQ.z;
|
|
806
|
+
p2t.z *= gQ.z;
|
|
805
807
|
float rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
806
808
|
|
|
807
809
|
|
|
@@ -831,9 +833,9 @@ return 1.0 / d;
|
|
|
831
833
|
#endif
|
|
832
834
|
}
|
|
833
835
|
|
|
834
|
-
vec3 eZ(vec3
|
|
836
|
+
vec3 eZ(vec3 gE, vec3 o) {
|
|
835
837
|
#ifdef DEPTH_QUERY_MODE
|
|
836
|
-
return abs(
|
|
838
|
+
return abs(gE) * max(vec3(1.0), abs(o)) * 1e-6;
|
|
837
839
|
#else
|
|
838
840
|
return vec3(0.0);
|
|
839
841
|
#endif
|
|
@@ -843,18 +845,18 @@ return vec3(0.0);
|
|
|
843
845
|
|
|
844
846
|
float cM(vec3 o, vec3 d, vec3 vK, vec3 vJ, float tMax) {
|
|
845
847
|
#ifdef DEPTH_QUERY_MODE
|
|
846
|
-
vec3
|
|
847
|
-
vec3 uR = (vK - o) *
|
|
848
|
-
vec3 uS = (vJ - o) *
|
|
849
|
-
vec3 bJ = eZ(
|
|
848
|
+
vec3 gE = fb(d);
|
|
849
|
+
vec3 uR = (vK - o) * gE;
|
|
850
|
+
vec3 uS = (vJ - o) * gE;
|
|
851
|
+
vec3 bJ = eZ(gE, o);
|
|
850
852
|
#else
|
|
851
853
|
vec3 uR = (vK - o) / d;
|
|
852
854
|
vec3 uS = (vJ - o) / d;
|
|
853
855
|
vec3 bJ = vec3(0.0);
|
|
854
856
|
#endif
|
|
855
|
-
vec3
|
|
857
|
+
vec3 mK = min(uR, uS) - bJ;
|
|
856
858
|
vec3 rU = max(uR, uS) + bJ;
|
|
857
|
-
float t0 = max(
|
|
859
|
+
float t0 = max(mK.x, max(mK.y, mK.z));
|
|
858
860
|
float t1 = min(rU.x, min(rU.y, rU.z));
|
|
859
861
|
|
|
860
862
|
return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
|
|
@@ -864,7 +866,7 @@ int maxDimension(vec3 v) {
|
|
|
864
866
|
return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
|
|
865
867
|
}
|
|
866
868
|
|
|
867
|
-
vec3
|
|
869
|
+
vec3 mu(vec3 d, int ey) {
|
|
868
870
|
|
|
869
871
|
|
|
870
872
|
if (ey == 0) {
|
|
@@ -885,12 +887,12 @@ return;
|
|
|
885
887
|
}
|
|
886
888
|
|
|
887
889
|
int ey = maxDimension(abs(ray.d));
|
|
888
|
-
vec3
|
|
890
|
+
vec3 gQ = mu(ray.d, ey);
|
|
889
891
|
int ao;
|
|
890
892
|
|
|
891
893
|
${getBVHTraverseCode(glsl `
|
|
892
894
|
si.triangleIndex = triangleIndex;
|
|
893
|
-
|
|
895
|
+
lB = tri;
|
|
894
896
|
hB = faceNormal;
|
|
895
897
|
aB = hit.barycentric;
|
|
896
898
|
hw = index;
|
|
@@ -902,7 +904,7 @@ if (rb) {
|
|
|
902
904
|
si.instanceIndex = ao;
|
|
903
905
|
si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
904
906
|
|
|
905
|
-
ht(si,
|
|
907
|
+
ht(si, lB, aB, hw);
|
|
906
908
|
mat4 l2w = mat4(
|
|
907
909
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
908
910
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -919,7 +921,7 @@ mat3 aD = transpose(mat3(w2l));
|
|
|
919
921
|
si.faceNormal = normalize(aD * hB);
|
|
920
922
|
si.vertexNormal = normalize(aD * si.vertexNormal);
|
|
921
923
|
si.normal = normalize(aD * si.normal);
|
|
922
|
-
#ifdef
|
|
924
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
923
925
|
si.coatNormal = normalize(aD * si.coatNormal);
|
|
924
926
|
#endif
|
|
925
927
|
#ifdef USE_TANGENT
|
|
@@ -946,12 +948,12 @@ return;
|
|
|
946
948
|
|
|
947
949
|
bool doubleSided = true;
|
|
948
950
|
int ey = maxDimension(abs(ray.d));
|
|
949
|
-
vec3
|
|
951
|
+
vec3 gQ = mu(ray.d, ey);
|
|
950
952
|
int ao;
|
|
951
953
|
|
|
952
954
|
${getBVHTraverseCode(glsl `
|
|
953
955
|
si.triangleIndex = triangleIndex;
|
|
954
|
-
|
|
956
|
+
lB = tri;
|
|
955
957
|
hB = faceNormal;
|
|
956
958
|
aB = hit.barycentric;
|
|
957
959
|
hw = index;
|
|
@@ -966,7 +968,7 @@ continue;
|
|
|
966
968
|
if (rb) {
|
|
967
969
|
si.instanceIndex = ao;
|
|
968
970
|
si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
969
|
-
ht(si,
|
|
971
|
+
ht(si, lB, aB, hw);
|
|
970
972
|
mat4 l2w = mat4(
|
|
971
973
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
972
974
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -983,7 +985,7 @@ mat3 aD = transpose(mat3(w2l));
|
|
|
983
985
|
si.faceNormal = normalize(aD * hB);
|
|
984
986
|
si.vertexNormal = normalize(aD * si.vertexNormal);
|
|
985
987
|
si.normal = normalize(aD * si.normal);
|
|
986
|
-
#ifdef
|
|
988
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
987
989
|
si.coatNormal = normalize(aD * si.coatNormal);
|
|
988
990
|
#endif
|
|
989
991
|
#ifdef USE_TANGENT
|
|
@@ -1008,7 +1010,7 @@ return false;
|
|
|
1008
1010
|
|
|
1009
1011
|
bool doubleSided = true;
|
|
1010
1012
|
int ey = maxDimension(abs(ray.d));
|
|
1011
|
-
vec3
|
|
1013
|
+
vec3 gQ = mu(ray.d, ey);
|
|
1012
1014
|
|
|
1013
1015
|
${getBVHTraverseCode(glsl `
|
|
1014
1016
|
|
|
@@ -1020,9 +1022,9 @@ vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z
|
|
|
1020
1022
|
if (jt) {
|
|
1021
1023
|
#ifdef HAS_ALPHA
|
|
1022
1024
|
int materialIndex = int(ae(floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
1023
|
-
ivec2 i0 =
|
|
1024
|
-
ivec2 i1 =
|
|
1025
|
-
ivec2 i2 =
|
|
1025
|
+
ivec2 i0 = gR(index.x, vertexColumns);
|
|
1026
|
+
ivec2 i1 = gR(index.y, vertexColumns);
|
|
1027
|
+
ivec2 i2 = gR(index.z, vertexColumns);
|
|
1026
1028
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
1027
1029
|
ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
1028
1030
|
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
@@ -1042,12 +1044,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1042
1044
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1043
1045
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1044
1046
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1045
|
-
vec4
|
|
1046
|
-
int uvProjection = int(
|
|
1047
|
+
vec4 lL = fetchMatData(ii + MAT_ROW_UV);
|
|
1048
|
+
int uvProjection = int(lL.r);
|
|
1047
1049
|
if (uvProjection > 0) {
|
|
1048
|
-
uv =
|
|
1050
|
+
uv = gI(uvProjection, position, hB, lL.zw);
|
|
1049
1051
|
} else {
|
|
1050
|
-
uv *=
|
|
1052
|
+
uv *= lL.zw;
|
|
1051
1053
|
}
|
|
1052
1054
|
|
|
1053
1055
|
alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
@@ -1061,12 +1063,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1061
1063
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1062
1064
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1063
1065
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1064
|
-
vec4
|
|
1065
|
-
int uvProjection = int(
|
|
1066
|
+
vec4 lL = fetchMatData(ii + MAT_ROW_UV);
|
|
1067
|
+
int uvProjection = int(lL.r);
|
|
1066
1068
|
if (uvProjection > 0) {
|
|
1067
|
-
uv =
|
|
1069
|
+
uv = gI(uvProjection, position, hB, lL.zw);
|
|
1068
1070
|
} else {
|
|
1069
|
-
uv *=
|
|
1071
|
+
uv *= lL.zw;
|
|
1070
1072
|
}
|
|
1071
1073
|
alpha *= sampleMap(alphaMapIndex, uv).g;
|
|
1072
1074
|
}
|