@meimu/mutracer 0.1.1 → 0.1.3
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 +3525 -3484
- package/docs/materials.md +27 -7
- package/docs/threejs.md +13 -2
- package/docs/viewer.md +53 -0
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +2 -1
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
- package/lib/renderer/WGPURayTraceOutput.js +14 -12
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.js +2 -2
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +20 -18
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.js +3 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
- package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
- package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +128 -128
- package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
- package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
- package/lib/renderer/lightsUtil.js +1 -1
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +5 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/materialLayout.js +2 -1
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +4 -2
- package/lib/renderer/prepareMeshBVH.js +44 -20
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
- package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +4 -2
- package/lib/scene/OpenPBRMaterial.js +4 -2
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/openPbrSchema.d.ts +7 -2
- package/lib/scene/openPbrSchema.js +2 -1
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +1 -0
- package/lib/util/fromTHREE.js +24 -6
- package/lib/util/fromTHREE.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 +5 -4
|
@@ -13,24 +13,24 @@ ${skipTriangleCode}
|
|
|
13
13
|
vec4 r3 = dp(triangleIndex);
|
|
14
14
|
ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
|
|
15
15
|
fu tri = fu(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
ky(positionBuffer, index.x, vertexColumns).xyz,
|
|
17
|
+
ky(positionBuffer, index.y, vertexColumns).xyz,
|
|
18
|
+
ky(positionBuffer, index.z, vertexColumns).xyz
|
|
19
19
|
);
|
|
20
|
-
eB hit = fI(o, d, tri, ey,
|
|
20
|
+
eB hit = fI(o, d, tri, ey, gL, tMax);
|
|
21
21
|
|
|
22
22
|
if (hit.t > 0.0) {
|
|
23
23
|
tMax = hit.t;
|
|
24
24
|
vec3 e1 = tri.p1 - tri.p0;
|
|
25
25
|
vec3 e2 = tri.p2 - tri.p0;
|
|
26
26
|
vec3 faceNormal = normalize(cross(e1, e2));
|
|
27
|
-
int
|
|
27
|
+
int kd = int(ae(
|
|
28
28
|
floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)
|
|
29
29
|
).x);
|
|
30
|
-
bool
|
|
31
|
-
|
|
30
|
+
bool iI = fetchMatData(
|
|
31
|
+
kd * MAT_DATA_SIZE + MAT_ROW_ALPHA
|
|
32
32
|
).z > 0.5;
|
|
33
|
-
if (!doubleSided && !
|
|
33
|
+
if (!doubleSided && !iI && dot(faceNormal, d) > 0.0) {
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -41,31 +41,31 @@ ${handleHitCode}
|
|
|
41
41
|
return glsl `
|
|
42
42
|
ivec2 stack[STACK_SIZE];
|
|
43
43
|
int top = -1;
|
|
44
|
-
int
|
|
44
|
+
int sG = -1;
|
|
45
45
|
float tMax = ${initialTMax};
|
|
46
46
|
|
|
47
47
|
vec3 o = ray.o;
|
|
48
48
|
vec3 d = ray.d;
|
|
49
49
|
|
|
50
|
-
bool
|
|
51
|
-
vec3
|
|
50
|
+
bool qT = false;
|
|
51
|
+
vec3 hx;
|
|
52
52
|
vec3 aB;
|
|
53
53
|
ivec3 hs;
|
|
54
54
|
|
|
55
|
-
fu
|
|
55
|
+
fu lp;
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
top = 0;
|
|
59
59
|
stack[0] = ivec2(0, -1);
|
|
60
60
|
|
|
61
|
-
int
|
|
62
|
-
while(top >= 0 &&
|
|
63
|
-
|
|
61
|
+
int wk = 0;
|
|
62
|
+
while(top >= 0 && wk < 5000) {
|
|
63
|
+
wk++;
|
|
64
64
|
ivec2 node = stack[top--];
|
|
65
65
|
|
|
66
66
|
int cf = node.y;
|
|
67
67
|
|
|
68
|
-
if (cf !=
|
|
68
|
+
if (cf != sG) {
|
|
69
69
|
if (cf < 0) {
|
|
70
70
|
o = ray.o;
|
|
71
71
|
d = ray.d;
|
|
@@ -81,110 +81,110 @@ 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
|
-
|
|
85
|
-
|
|
84
|
+
gL = mj(d, ey);
|
|
85
|
+
sG = cf;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
int bo = cf < 0 ? 0 : blasOffset;
|
|
89
89
|
uint fG = cf < 0 ? 0u : floatBitsToUint(bv(cf * ${INSTANCE_VEC4_STRIDE}).x);
|
|
90
|
-
int
|
|
90
|
+
int gN = int(fG >> 30u);
|
|
91
91
|
int eS = int(fG & 0x3fffffffu);
|
|
92
92
|
int bh = 0;
|
|
93
93
|
int primitiveOffset = 0;
|
|
94
94
|
|
|
95
|
-
if (
|
|
96
|
-
uint
|
|
97
|
-
if ((
|
|
98
|
-
bh = int((
|
|
99
|
-
primitiveOffset = bo + eS + int(
|
|
95
|
+
if (gN == 3) {
|
|
96
|
+
uint hS = uint(node.x);
|
|
97
|
+
if ((hS & 0x80000000u) != 0u) {
|
|
98
|
+
bh = int((hS >> 23u) & 0xffu);
|
|
99
|
+
primitiveOffset = bo + eS + int(hS & 0x007fffffu);
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
102
|
int i = node.x + bo;
|
|
103
|
-
vec4
|
|
103
|
+
vec4 ju = dp(i);
|
|
104
104
|
vec4 fC = dp(i + 1);
|
|
105
|
-
vec4
|
|
106
|
-
vec4
|
|
107
|
-
vec4
|
|
108
|
-
uint header = floatBitsToUint(
|
|
109
|
-
int
|
|
110
|
-
int
|
|
111
|
-
int
|
|
112
|
-
vec3
|
|
113
|
-
uintBitsToFloat(uint(
|
|
114
|
-
uintBitsToFloat(uint(
|
|
115
|
-
uintBitsToFloat(uint(
|
|
105
|
+
vec4 mK = dp(i + 2);
|
|
106
|
+
vec4 mL = dp(i + 3);
|
|
107
|
+
vec4 mM = dp(i + 4);
|
|
108
|
+
uint header = floatBitsToUint(ju.w);
|
|
109
|
+
int rv = int(header << 24u) >> 24;
|
|
110
|
+
int rw = int((header >> 8u) << 24u) >> 24;
|
|
111
|
+
int rA = int((header >> 16u) << 24u) >> 24;
|
|
112
|
+
vec3 hF = vec3(
|
|
113
|
+
uintBitsToFloat(uint(rv + 127) << 23u),
|
|
114
|
+
uintBitsToFloat(uint(rw + 127) << 23u),
|
|
115
|
+
uintBitsToFloat(uint(rA + 127) << 23u)
|
|
116
116
|
);
|
|
117
117
|
uint childBase = floatBitsToUint(fC.x);
|
|
118
|
-
uint
|
|
118
|
+
uint oH = floatBitsToUint(fC.y);
|
|
119
119
|
uint internalMask = header >> 24u;
|
|
120
|
-
uint
|
|
120
|
+
uint ul = (d.x < 0.0 ? 4u : 0u) |
|
|
121
121
|
(d.y < 0.0 ? 2u : 0u) |
|
|
122
122
|
(d.z < 0.0 ? 1u : 0u);
|
|
123
|
-
uint
|
|
124
|
-
floatBitsToUint(
|
|
125
|
-
floatBitsToUint(
|
|
126
|
-
floatBitsToUint(
|
|
127
|
-
floatBitsToUint(
|
|
128
|
-
floatBitsToUint(
|
|
129
|
-
floatBitsToUint(
|
|
123
|
+
uint gE[12] = uint[12](
|
|
124
|
+
floatBitsToUint(mK.x), floatBitsToUint(mK.y),
|
|
125
|
+
floatBitsToUint(mK.z), floatBitsToUint(mK.w),
|
|
126
|
+
floatBitsToUint(mL.x), floatBitsToUint(mL.y),
|
|
127
|
+
floatBitsToUint(mL.z), floatBitsToUint(mL.w),
|
|
128
|
+
floatBitsToUint(mM.x), floatBitsToUint(mM.y),
|
|
129
|
+
floatBitsToUint(mM.z), floatBitsToUint(mM.w)
|
|
130
130
|
);
|
|
131
131
|
|
|
132
132
|
for (int order = 7; order >= 0; order--) {
|
|
133
|
-
uint slot = uint(order) ^
|
|
134
|
-
uint
|
|
133
|
+
uint slot = uint(order) ^ ul;
|
|
134
|
+
uint su = slot >= 4u
|
|
135
135
|
? floatBitsToUint(fC.w)
|
|
136
136
|
: floatBitsToUint(fC.z);
|
|
137
|
-
uint meta = (
|
|
137
|
+
uint meta = (su >> ((slot & 3u) * 8u)) & 0xffu;
|
|
138
138
|
if (meta == 0u) continue;
|
|
139
|
-
uint
|
|
140
|
-
uint
|
|
141
|
-
vec3
|
|
142
|
-
float((
|
|
143
|
-
float((
|
|
144
|
-
float((
|
|
139
|
+
uint lO = (slot & 3u) * 8u;
|
|
140
|
+
uint kM = slot >> 2u;
|
|
141
|
+
vec3 tA = vec3(
|
|
142
|
+
float((gE[kM] >> lO) & 0xffu),
|
|
143
|
+
float((gE[2u + kM] >> lO) & 0xffu),
|
|
144
|
+
float((gE[4u + kM] >> lO) & 0xffu)
|
|
145
145
|
);
|
|
146
|
-
vec3
|
|
147
|
-
float((
|
|
148
|
-
float((
|
|
149
|
-
float((
|
|
146
|
+
vec3 tw = vec3(
|
|
147
|
+
float((gE[6u + kM] >> lO) & 0xffu),
|
|
148
|
+
float((gE[8u + kM] >> lO) & 0xffu),
|
|
149
|
+
float((gE[10u + kM] >> lO) & 0xffu)
|
|
150
150
|
);
|
|
151
|
-
vec3
|
|
152
|
-
vec3
|
|
153
|
-
if (cM(o, d,
|
|
154
|
-
uint
|
|
155
|
-
if (
|
|
156
|
-
uint
|
|
157
|
-
uint
|
|
151
|
+
vec3 uP = ju.xyz + tA * hF;
|
|
152
|
+
vec3 uO = ju.xyz + tw * hF;
|
|
153
|
+
if (cM(o, d, uP, uO, tMax) <= 0.0) continue;
|
|
154
|
+
uint jw = meta & 0x1fu;
|
|
155
|
+
if (jw >= 24u) {
|
|
156
|
+
uint ne = internalMask & ((1u << slot) - 1u);
|
|
157
|
+
uint sQ = childBase + qK(ne);
|
|
158
158
|
stack[++top] = ivec2(
|
|
159
|
-
eS + int(
|
|
159
|
+
eS + int(sQ * 5u), cf
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
|
-
uint triangleCount =
|
|
164
|
-
uint
|
|
165
|
-
uint
|
|
163
|
+
uint triangleCount = qK(meta >> 5u);
|
|
164
|
+
uint rK = oH + jw;
|
|
165
|
+
uint uZ = 0x80000000u |
|
|
166
166
|
(triangleCount << 23u) |
|
|
167
|
-
(
|
|
168
|
-
stack[++top] = ivec2(int(
|
|
167
|
+
(rK & 0x007fffffu);
|
|
168
|
+
stack[++top] = ivec2(int(uZ), cf);
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
else if (
|
|
173
|
+
else if (gN == 2) {
|
|
174
174
|
int i = node.x + bo;
|
|
175
|
-
vec4
|
|
176
|
-
vec4
|
|
177
|
-
vec4
|
|
178
|
-
vec4
|
|
179
|
-
bh = int(floatBitsToUint(
|
|
175
|
+
vec4 uR = dp(i);
|
|
176
|
+
vec4 uS = dp(i + 1);
|
|
177
|
+
vec4 uT = dp(i + 2);
|
|
178
|
+
vec4 uU = dp(i + 3);
|
|
179
|
+
bh = int(floatBitsToUint(uT.w));
|
|
180
180
|
if (bh > 0) {
|
|
181
|
-
primitiveOffset = bo + eS + int(floatBitsToUint(
|
|
181
|
+
primitiveOffset = bo + eS + int(floatBitsToUint(uU.w));
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
int left = eS + int(floatBitsToUint(
|
|
185
|
-
int right = eS + int(floatBitsToUint(
|
|
186
|
-
float d0 = cM(o, d,
|
|
187
|
-
float d1 = cM(o, d,
|
|
184
|
+
int left = eS + int(floatBitsToUint(uR.w) * 4u);
|
|
185
|
+
int right = eS + int(floatBitsToUint(uS.w) * 4u);
|
|
186
|
+
float d0 = cM(o, d, uR.xyz, uS.xyz, tMax);
|
|
187
|
+
float d1 = cM(o, d, uT.xyz, uU.xyz, tMax);
|
|
188
188
|
if (d0 > d1) {
|
|
189
189
|
if (d0 > 0.0) stack[++top] = ivec2(left, cf);
|
|
190
190
|
if (d1 > 0.0) stack[++top] = ivec2(right, cf);
|
|
@@ -195,42 +195,42 @@ if (d0 > 0.0) stack[++top] = ivec2(left, cf);
|
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
-
else if (
|
|
199
|
-
uint
|
|
200
|
-
if ((
|
|
201
|
-
bh = int((
|
|
202
|
-
primitiveOffset = bo + eS + int(
|
|
198
|
+
else if (gN == 1) {
|
|
199
|
+
uint hS = uint(node.x);
|
|
200
|
+
if ((hS & 0x80000000u) != 0u) {
|
|
201
|
+
bh = int((hS >> 23u) & 0xffu);
|
|
202
|
+
primitiveOffset = bo + eS + int(hS & 0x007fffffu);
|
|
203
203
|
}
|
|
204
204
|
else {
|
|
205
205
|
int i = node.x + bo;
|
|
206
|
-
vec4
|
|
207
|
-
vec4
|
|
208
|
-
vec4
|
|
209
|
-
vec4
|
|
210
|
-
vec3 nodeMin =
|
|
211
|
-
vec3 ec = vec3(
|
|
212
|
-
uint
|
|
213
|
-
floatBitsToUint(
|
|
214
|
-
floatBitsToUint(
|
|
206
|
+
vec4 ub = dp(i);
|
|
207
|
+
vec4 rf = dp(i + 1);
|
|
208
|
+
vec4 rh = dp(i + 2);
|
|
209
|
+
vec4 ri = dp(i + 3);
|
|
210
|
+
vec3 nodeMin = ub.xyz;
|
|
211
|
+
vec3 ec = vec3(ub.w, rf.x, rf.y);
|
|
212
|
+
uint lV[4] = uint[4](
|
|
213
|
+
floatBitsToUint(rf.z), floatBitsToUint(rf.w),
|
|
214
|
+
floatBitsToUint(rh.x), floatBitsToUint(rh.y)
|
|
215
215
|
);
|
|
216
|
-
vec4
|
|
217
|
-
vec4
|
|
218
|
-
vec4
|
|
219
|
-
vec4
|
|
220
|
-
vec4
|
|
221
|
-
vec4
|
|
222
|
-
vec3
|
|
223
|
-
vec3 bJ = eV(
|
|
224
|
-
vec4 tx0 = (nodeMin.x +
|
|
225
|
-
vec4 tx1 = (nodeMin.x +
|
|
226
|
-
vec4 ty0 = (nodeMin.y +
|
|
227
|
-
vec4 ty1 = (nodeMin.y +
|
|
228
|
-
vec4 tz0 = (nodeMin.z +
|
|
229
|
-
vec4 tz1 = (nodeMin.z +
|
|
230
|
-
vec4
|
|
231
|
-
vec4
|
|
232
|
-
vec4 distance = mix(
|
|
233
|
-
distance = mix(distance, vec4(-1.0), greaterThan(
|
|
216
|
+
vec4 ro = eY(floatBitsToUint(rh.z));
|
|
217
|
+
vec4 rp = eY(floatBitsToUint(rh.w));
|
|
218
|
+
vec4 rq = eY(floatBitsToUint(ri.x));
|
|
219
|
+
vec4 rl = eY(floatBitsToUint(ri.y));
|
|
220
|
+
vec4 rm = eY(floatBitsToUint(ri.z));
|
|
221
|
+
vec4 rn = eY(floatBitsToUint(ri.w));
|
|
222
|
+
vec3 gx = eX(d);
|
|
223
|
+
vec3 bJ = eV(gx, o);
|
|
224
|
+
vec4 tx0 = (nodeMin.x + ro * ec.x - o.x) * gx.x;
|
|
225
|
+
vec4 tx1 = (nodeMin.x + rl * ec.x - o.x) * gx.x;
|
|
226
|
+
vec4 ty0 = (nodeMin.y + rp * ec.y - o.y) * gx.y;
|
|
227
|
+
vec4 ty1 = (nodeMin.y + rm * ec.y - o.y) * gx.y;
|
|
228
|
+
vec4 tz0 = (nodeMin.z + rq * ec.z - o.z) * gx.z;
|
|
229
|
+
vec4 tz1 = (nodeMin.z + rn * ec.z - o.z) * gx.z;
|
|
230
|
+
vec4 mB = max(max((min(tx0, tx1) - vec4(bJ.x)), (min(ty0, ty1) - vec4(bJ.y))), (min(tz0, tz1) - vec4(bJ.z)));
|
|
231
|
+
vec4 rM = min(min((max(tx0, tx1) + vec4(bJ.x)), (max(ty0, ty1) + vec4(bJ.y))), (max(tz0, tz1) + vec4(bJ.z)));
|
|
232
|
+
vec4 distance = mix(rM, mB, greaterThan(mB, vec4(0.0)));
|
|
233
|
+
distance = mix(distance, vec4(-1.0), greaterThan(mB, min(rM, vec4(tMax))));
|
|
234
234
|
float fa[4] = float[4](distance.x, distance.y, distance.z, distance.w);
|
|
235
235
|
|
|
236
236
|
|
|
@@ -238,18 +238,18 @@ 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 (lV[child] != 0u && fa[child] > dX) {
|
|
242
242
|
dX = fa[child];
|
|
243
243
|
el = child;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
if (el >= 0 && dX > 0.0) {
|
|
247
|
-
uint
|
|
248
|
-
int
|
|
249
|
-
if ((
|
|
250
|
-
|
|
247
|
+
uint nl = lV[el];
|
|
248
|
+
int jD = int(nl);
|
|
249
|
+
if ((nl & 0x80000000u) == 0u) {
|
|
250
|
+
jD += eS;
|
|
251
251
|
}
|
|
252
|
-
stack[++top] = ivec2(
|
|
252
|
+
stack[++top] = ivec2(jD, cf);
|
|
253
253
|
fa[el] = -1.0;
|
|
254
254
|
}
|
|
255
255
|
}
|
|
@@ -347,7 +347,7 @@ return t2;
|
|
|
347
347
|
return INF;
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
float
|
|
350
|
+
float mU(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 mo(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 = mU(pos, u, v, normal, r);
|
|
387
387
|
if (d < 0.) {
|
|
388
388
|
d = INF;
|
|
389
389
|
}
|
|
@@ -400,9 +400,9 @@ lightSample.emission = light.emission;
|
|
|
400
400
|
#ifdef HAS_SPHERE_LIGHTS
|
|
401
401
|
if (type == SPHERE_LIGHT) {
|
|
402
402
|
if (light.radius <= 0.0) {
|
|
403
|
-
vec3
|
|
404
|
-
float projection = dot(
|
|
405
|
-
vec3 ba =
|
|
403
|
+
vec3 kh = light.position - r.o;
|
|
404
|
+
float projection = dot(kh, r.d);
|
|
405
|
+
vec3 ba = kh - projection * r.d;
|
|
406
406
|
if (projection <= EPS || dot(ba, ba) > 1e-8) return INF;
|
|
407
407
|
d = projection;
|
|
408
408
|
lightSample.direction = r.d;
|
|
@@ -436,9 +436,9 @@ lightSample.emission = light.radius <= 0.0
|
|
|
436
436
|
#ifdef HAS_SPOT_LIGHTS
|
|
437
437
|
if (type == SPOT_LIGHT) {
|
|
438
438
|
if (light.radius <= 0.0) {
|
|
439
|
-
vec3
|
|
440
|
-
float projection = dot(
|
|
441
|
-
vec3 ba =
|
|
439
|
+
vec3 kh = light.position - r.o;
|
|
440
|
+
float projection = dot(kh, r.d);
|
|
441
|
+
vec3 ba = kh - projection * r.d;
|
|
442
442
|
if (projection <= EPS || dot(ba, ba) > 1e-8) return INF;
|
|
443
443
|
d = projection;
|
|
444
444
|
lightSample.direction = r.d;
|
|
@@ -451,9 +451,9 @@ d = ht(light.radius, light.position, r);
|
|
|
451
451
|
lightSample.isDelta = false;
|
|
452
452
|
}
|
|
453
453
|
if (d != INF) {
|
|
454
|
-
vec3
|
|
455
|
-
float
|
|
456
|
-
if (
|
|
454
|
+
vec3 uX = r.o + d * r.d;
|
|
455
|
+
float mr = bL(light, normalize(r.o - uX));
|
|
456
|
+
if (mr <= 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 * mr * (light.radius <= 0.0
|
|
467
467
|
? 1.0 / max(d * d, 1e-8)
|
|
468
468
|
: 1.0);
|
|
469
469
|
}
|
|
@@ -494,76 +494,76 @@ float w20 = m20.y * eZ.z;
|
|
|
494
494
|
float w21 = m21.y * eZ.z;
|
|
495
495
|
float w22 = m22.y * eZ.z;
|
|
496
496
|
|
|
497
|
-
float
|
|
497
|
+
float hg = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
498
498
|
|
|
499
|
-
w00 = w00 /
|
|
500
|
-
w01 = w01 /
|
|
501
|
-
w02 = w02 /
|
|
502
|
-
w10 = w10 /
|
|
503
|
-
w11 = w11 /
|
|
504
|
-
w12 = w12 /
|
|
505
|
-
w20 = w20 /
|
|
506
|
-
w21 = w21 /
|
|
507
|
-
w22 = w22 /
|
|
499
|
+
w00 = w00 / hg;
|
|
500
|
+
w01 = w01 / hg + w00;
|
|
501
|
+
w02 = w02 / hg + w01;
|
|
502
|
+
w10 = w10 / hg + w02;
|
|
503
|
+
w11 = w11 / hg + w10;
|
|
504
|
+
w12 = w12 / hg + w11;
|
|
505
|
+
w20 = w20 / hg + w12;
|
|
506
|
+
w21 = w21 / hg + w20;
|
|
507
|
+
w22 = w22 / hg + w21;
|
|
508
508
|
|
|
509
509
|
float rand = eo(0u);
|
|
510
|
-
float
|
|
510
|
+
float mV;
|
|
511
511
|
if (rand < w00) {
|
|
512
|
-
|
|
512
|
+
mV = m00.x;
|
|
513
513
|
} else if (rand < w01) {
|
|
514
|
-
|
|
514
|
+
mV = m01.x;
|
|
515
515
|
} else if (rand < w02) {
|
|
516
|
-
|
|
516
|
+
mV = m02.x;
|
|
517
517
|
} else if (rand < w10) {
|
|
518
|
-
|
|
518
|
+
mV = m10.x;
|
|
519
519
|
} else if (rand < w11) {
|
|
520
|
-
|
|
520
|
+
mV = m11.x;
|
|
521
521
|
} else if (rand < w12) {
|
|
522
|
-
|
|
522
|
+
mV = m12.x;
|
|
523
523
|
} else if (rand < w20) {
|
|
524
|
-
|
|
524
|
+
mV = m20.x;
|
|
525
525
|
} else if (rand < w21) {
|
|
526
|
-
|
|
526
|
+
mV = m21.x;
|
|
527
527
|
} else {
|
|
528
|
-
|
|
528
|
+
mV = m22.x;
|
|
529
529
|
}
|
|
530
|
-
return int(
|
|
530
|
+
return int(mV);
|
|
531
531
|
}
|
|
532
532
|
|
|
533
533
|
|
|
534
534
|
vec4 bv(int i);
|
|
535
535
|
|
|
536
536
|
|
|
537
|
-
mat2x3 eD(vec3 normal, vec3 dp1, vec3 dp2, vec2
|
|
538
|
-
float determinant =
|
|
537
|
+
mat2x3 eD(vec3 normal, vec3 dp1, vec3 dp2, vec2 nS, vec2 nT, vec4 aU) {
|
|
538
|
+
float determinant = nS.x * nT.y - nS.y * nT.x;
|
|
539
539
|
vec3 t = aU.xyz;
|
|
540
540
|
vec3 b = vec3(0.0);
|
|
541
541
|
|
|
542
|
-
float
|
|
542
|
+
float qu = abs(aU.w) > 1.5 ? 0.0 : aU.w;
|
|
543
543
|
if (abs(determinant) > 1e-12) {
|
|
544
|
-
vec3 dt = (dp1 *
|
|
545
|
-
vec3 db = (dp2 *
|
|
544
|
+
vec3 dt = (dp1 * nT.y - dp2 * nS.y) / determinant;
|
|
545
|
+
vec3 db = (dp2 * nS.x - dp1 * nT.x) / determinant;
|
|
546
546
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
547
|
-
if (
|
|
547
|
+
if (qu == 0.0) { qu = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
|
|
548
548
|
}
|
|
549
549
|
t -= normal * dot(normal, t);
|
|
550
550
|
if (dot(t, t) < 1e-8) {
|
|
551
|
-
float
|
|
552
|
-
float dW = -1.0 / (
|
|
551
|
+
float ie = (normal.z >= 0.0 ? 1.0 : -1.0);
|
|
552
|
+
float dW = -1.0 / (ie + normal.z);
|
|
553
553
|
float xy = normal.x * normal.y * dW;
|
|
554
|
-
t = vec3(1.0 +
|
|
555
|
-
b = vec3(xy,
|
|
554
|
+
t = vec3(1.0 + ie * normal.x * normal.x * dW, ie * xy, -ie * normal.x);
|
|
555
|
+
b = vec3(xy, ie + normal.y * normal.y * dW, -normal.y);
|
|
556
556
|
}
|
|
557
557
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
558
|
-
return mat2x3(t, b * (
|
|
558
|
+
return mat2x3(t, b * (qu < 0.0 ? -1.0 : 1.0));
|
|
559
559
|
}
|
|
560
560
|
|
|
561
561
|
void hp(inout ad si, fu 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 = gM(index.x, vertexColumns);
|
|
565
|
+
ivec2 i1 = gM(index.y, vertexColumns);
|
|
566
|
+
ivec2 i2 = gM(index.z, vertexColumns);
|
|
567
567
|
|
|
568
568
|
vec3 n0 = texelFetch(normalBuffer, i0, 0).xyz;
|
|
569
569
|
vec3 n1 = texelFetch(normalBuffer, i1, 0).xyz;
|
|
@@ -576,14 +576,14 @@ si.vertexNormal = normal;
|
|
|
576
576
|
|
|
577
577
|
|
|
578
578
|
vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
579
|
-
vec3
|
|
579
|
+
vec3 kf = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
|
|
580
580
|
float a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
581
581
|
float b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
582
582
|
float c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
583
583
|
float h = a * barycentric.x * (barycentric.x - 1.0)
|
|
584
584
|
+ (a + b + c) * barycentric.x * barycentric.y
|
|
585
585
|
+ b * barycentric.y * (barycentric.y - 1.0);
|
|
586
|
-
if (dot(
|
|
586
|
+
if (dot(kf, geometricNormal) > 0.0) {
|
|
587
587
|
float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
588
588
|
float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
589
589
|
float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -601,7 +601,7 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
|
|
|
601
601
|
h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
|
|
602
602
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
603
603
|
}
|
|
604
|
-
si.shadowOffset =
|
|
604
|
+
si.shadowOffset = kf * h;
|
|
605
605
|
|
|
606
606
|
|
|
607
607
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
@@ -624,14 +624,14 @@ vec2 cX = barycentric.x * secondaryUv0
|
|
|
624
624
|
+ barycentric.y * secondaryUv1
|
|
625
625
|
+ barycentric.z * secondaryUv2;
|
|
626
626
|
|
|
627
|
-
vec4
|
|
628
|
-
int uvProjection = int(
|
|
627
|
+
vec4 lC = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
|
|
628
|
+
int uvProjection = int(lC.r);
|
|
629
629
|
if (uvProjection > 0) {
|
|
630
|
-
uv =
|
|
630
|
+
uv = gC(uvProjection, si.position, normal, lC.zw);
|
|
631
631
|
cX = uv;
|
|
632
632
|
} else {
|
|
633
|
-
uv *=
|
|
634
|
-
cX *=
|
|
633
|
+
uv *= lC.zw;
|
|
634
|
+
cX *= lC.zw;
|
|
635
635
|
}
|
|
636
636
|
#else
|
|
637
637
|
vec2 uv = vec2(0.0);
|
|
@@ -640,13 +640,13 @@ vec2 cX = vec2(0.0);
|
|
|
640
640
|
|
|
641
641
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
642
642
|
si.coatNormal = normal;
|
|
643
|
-
float
|
|
643
|
+
float lm = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
|
|
644
644
|
#endif
|
|
645
645
|
vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
|
|
646
|
-
float
|
|
647
|
-
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 ||
|
|
646
|
+
float te = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
|
|
647
|
+
if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || te != 0.0
|
|
648
648
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
649
|
-
||
|
|
649
|
+
|| lm >= 0.0
|
|
650
650
|
#endif
|
|
651
651
|
) {
|
|
652
652
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
@@ -672,19 +672,19 @@ fU = eD(normal, dp1, dp2, a-c, b-c, (aU.w == 0.0 ? vec4(0.0) : aU));
|
|
|
672
672
|
si.directionTangent = fU[0];
|
|
673
673
|
si.directionBitangent = fU[1];
|
|
674
674
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
675
|
-
if (
|
|
676
|
-
int
|
|
677
|
-
mat2x3
|
|
678
|
-
if (mapUvChannel[
|
|
675
|
+
if (lm >= 0.0) {
|
|
676
|
+
int ku = int(lm);
|
|
677
|
+
mat2x3 lW = eP;
|
|
678
|
+
if (mapUvChannel[ku] > 0.5) {
|
|
679
679
|
vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
|
|
680
680
|
vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
|
|
681
681
|
vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
|
|
682
|
-
|
|
682
|
+
lW = eD(normal, dp1, dp2, a-c, b-c,
|
|
683
683
|
aU.w == 0.0 ? vec4(0.0) : aU);
|
|
684
684
|
}
|
|
685
|
-
vec3 decoded = sampleMap(
|
|
686
|
-
vec3 mapped =
|
|
687
|
-
+
|
|
685
|
+
vec3 decoded = sampleMap(ku, getMapUvSet(ku, uv, cX)).rgb * 2.0 - 1.0;
|
|
686
|
+
vec3 mapped = lW[0] * decoded.x * directionMaterial.z
|
|
687
|
+
+ lW[1] * decoded.y * directionMaterial.w + normal * decoded.z;
|
|
688
688
|
if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
|
|
689
689
|
}
|
|
690
690
|
#endif
|
|
@@ -702,10 +702,10 @@ si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z *
|
|
|
702
702
|
#if defined(NUM_NORMAL_MAPS)
|
|
703
703
|
vec3 dp1 = tri.p0 - tri.p2;
|
|
704
704
|
vec3 dp2 = tri.p1 - tri.p2;
|
|
705
|
-
vec2
|
|
706
|
-
vec2
|
|
707
|
-
si.normal =
|
|
708
|
-
si.materialIndex, uv, normal, dp1, dp2,
|
|
705
|
+
vec2 nS = uv0 - uv2;
|
|
706
|
+
vec2 nT = uv1 - uv2;
|
|
707
|
+
si.normal = ob(
|
|
708
|
+
si.materialIndex, uv, normal, dp1, dp2, nS, nT
|
|
709
709
|
);
|
|
710
710
|
#else
|
|
711
711
|
si.normal = normal;
|
|
@@ -718,35 +718,35 @@ vec3 barycentric;
|
|
|
718
718
|
};
|
|
719
719
|
|
|
720
720
|
vec4 dp(int i) {
|
|
721
|
-
return
|
|
721
|
+
return ky(bvhBuffer, i, bvhColumns);
|
|
722
722
|
}
|
|
723
723
|
|
|
724
724
|
vec4 bv(int i) {
|
|
725
|
-
return
|
|
725
|
+
return ky(instancesBuffer, i, instancesColumns);
|
|
726
726
|
}
|
|
727
727
|
|
|
728
728
|
|
|
729
729
|
|
|
730
|
-
uint
|
|
730
|
+
uint qK(uint value) {
|
|
731
731
|
value -= (value >> 1u) & 0x55555555u;
|
|
732
732
|
value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
|
|
733
733
|
value = (value + (value >> 4u)) & 0x0f0f0f0fu;
|
|
734
734
|
return (value * 0x01010101u) >> 24u;
|
|
735
735
|
}
|
|
736
736
|
|
|
737
|
-
vec4 eY(uint
|
|
737
|
+
vec4 eY(uint lL) {
|
|
738
738
|
return vec4(
|
|
739
|
-
float(
|
|
740
|
-
float((
|
|
741
|
-
float((
|
|
742
|
-
float(
|
|
739
|
+
float(lL & 0xffu),
|
|
740
|
+
float((lL >> 8u) & 0xffu),
|
|
741
|
+
float((lL >> 16u) & 0xffu),
|
|
742
|
+
float(lL >> 24u)
|
|
743
743
|
) / 255.0;
|
|
744
744
|
}
|
|
745
745
|
|
|
746
746
|
|
|
747
747
|
|
|
748
748
|
|
|
749
|
-
eB fI(vec3 o, vec3 d, fu tri, int ey, vec3
|
|
749
|
+
eB fI(vec3 o, vec3 d, fu tri, int ey, vec3 gL, float tMax) {
|
|
750
750
|
eB ti;
|
|
751
751
|
|
|
752
752
|
|
|
@@ -766,9 +766,9 @@ p2t = p2t.zxy;
|
|
|
766
766
|
}
|
|
767
767
|
|
|
768
768
|
|
|
769
|
-
p0t.xy +=
|
|
770
|
-
p1t.xy +=
|
|
771
|
-
p2t.xy +=
|
|
769
|
+
p0t.xy += gL.xy * p0t.z;
|
|
770
|
+
p1t.xy += gL.xy * p1t.z;
|
|
771
|
+
p2t.xy += gL.xy * p2t.z;
|
|
772
772
|
|
|
773
773
|
|
|
774
774
|
vec3 e = vec3(
|
|
@@ -778,9 +778,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
778
778
|
);
|
|
779
779
|
|
|
780
780
|
#ifdef DEPTH_QUERY_MODE
|
|
781
|
-
vec3
|
|
781
|
+
vec3 rt = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
782
782
|
+ abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
783
|
-
e = mix(e, vec3(0.0), lessThanEqual(abs(e),
|
|
783
|
+
e = mix(e, vec3(0.0), lessThanEqual(abs(e), rt * 1e-6));
|
|
784
784
|
#endif
|
|
785
785
|
|
|
786
786
|
|
|
@@ -793,19 +793,19 @@ float det = e.x + e.y + e.z;
|
|
|
793
793
|
if (det == 0.0) return ti;
|
|
794
794
|
#endif
|
|
795
795
|
|
|
796
|
-
p0t.z *=
|
|
797
|
-
p1t.z *=
|
|
798
|
-
p2t.z *=
|
|
799
|
-
float
|
|
796
|
+
p0t.z *= gL.z;
|
|
797
|
+
p1t.z *= gL.z;
|
|
798
|
+
p2t.z *= gL.z;
|
|
799
|
+
float rd = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
800
800
|
|
|
801
801
|
|
|
802
|
-
if (abs(
|
|
802
|
+
if (abs(rd) > abs(tMax * det)) {
|
|
803
803
|
return ti;
|
|
804
804
|
}
|
|
805
805
|
|
|
806
|
-
float
|
|
807
|
-
ti.t =
|
|
808
|
-
ti.barycentric = e *
|
|
806
|
+
float sm = 1. / det;
|
|
807
|
+
ti.t = rd * sm;
|
|
808
|
+
ti.barycentric = e * sm;
|
|
809
809
|
|
|
810
810
|
return ti;
|
|
811
811
|
}
|
|
@@ -825,9 +825,9 @@ return 1.0 / d;
|
|
|
825
825
|
#endif
|
|
826
826
|
}
|
|
827
827
|
|
|
828
|
-
vec3 eV(vec3
|
|
828
|
+
vec3 eV(vec3 gx, vec3 o) {
|
|
829
829
|
#ifdef DEPTH_QUERY_MODE
|
|
830
|
-
return abs(
|
|
830
|
+
return abs(gx) * max(vec3(1.0), abs(o)) * 1e-6;
|
|
831
831
|
#else
|
|
832
832
|
return vec3(0.0);
|
|
833
833
|
#endif
|
|
@@ -835,21 +835,21 @@ return vec3(0.0);
|
|
|
835
835
|
|
|
836
836
|
|
|
837
837
|
|
|
838
|
-
float cM(vec3 o, vec3 d, vec3
|
|
838
|
+
float cM(vec3 o, vec3 d, vec3 vD, vec3 vC, float tMax) {
|
|
839
839
|
#ifdef DEPTH_QUERY_MODE
|
|
840
|
-
vec3
|
|
841
|
-
vec3
|
|
842
|
-
vec3
|
|
843
|
-
vec3 bJ = eV(
|
|
840
|
+
vec3 gx = eX(d);
|
|
841
|
+
vec3 uK = (vD - o) * gx;
|
|
842
|
+
vec3 uL = (vC - o) * gx;
|
|
843
|
+
vec3 bJ = eV(gx, o);
|
|
844
844
|
#else
|
|
845
|
-
vec3
|
|
846
|
-
vec3
|
|
845
|
+
vec3 uK = (vD - o) / d;
|
|
846
|
+
vec3 uL = (vC - o) / d;
|
|
847
847
|
vec3 bJ = vec3(0.0);
|
|
848
848
|
#endif
|
|
849
|
-
vec3
|
|
850
|
-
vec3
|
|
851
|
-
float t0 = max(
|
|
852
|
-
float t1 = min(
|
|
849
|
+
vec3 mB = min(uK, uL) - bJ;
|
|
850
|
+
vec3 rM = max(uK, uL) + bJ;
|
|
851
|
+
float t0 = max(mB.x, max(mB.y, mB.z));
|
|
852
|
+
float t1 = min(rM.x, min(rM.y, rM.z));
|
|
853
853
|
|
|
854
854
|
return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
|
|
855
855
|
}
|
|
@@ -858,7 +858,7 @@ int maxDimension(vec3 v) {
|
|
|
858
858
|
return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
-
vec3
|
|
861
|
+
vec3 mj(vec3 d, int ey) {
|
|
862
862
|
|
|
863
863
|
|
|
864
864
|
if (ey == 0) {
|
|
@@ -879,24 +879,24 @@ return;
|
|
|
879
879
|
}
|
|
880
880
|
|
|
881
881
|
int ey = maxDimension(abs(ray.d));
|
|
882
|
-
vec3
|
|
882
|
+
vec3 gL = mj(ray.d, ey);
|
|
883
883
|
int ao;
|
|
884
884
|
|
|
885
885
|
${getBVHTraverseCode(glsl `
|
|
886
886
|
si.triangleIndex = triangleIndex;
|
|
887
|
-
|
|
888
|
-
|
|
887
|
+
lp = tri;
|
|
888
|
+
hx = faceNormal;
|
|
889
889
|
aB = hit.barycentric;
|
|
890
890
|
hs = index;
|
|
891
|
-
|
|
891
|
+
qT = true;
|
|
892
892
|
ao = cf;
|
|
893
893
|
`)}
|
|
894
894
|
|
|
895
|
-
if (
|
|
895
|
+
if (qT) {
|
|
896
896
|
si.instanceIndex = ao;
|
|
897
897
|
si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
898
898
|
|
|
899
|
-
hp(si,
|
|
899
|
+
hp(si, lp, aB, hs);
|
|
900
900
|
mat4 l2w = mat4(
|
|
901
901
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
902
902
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -910,7 +910,7 @@ bv(ao * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
|
910
910
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
911
911
|
);
|
|
912
912
|
mat3 aD = transpose(mat3(w2l));
|
|
913
|
-
si.faceNormal = normalize(aD *
|
|
913
|
+
si.faceNormal = normalize(aD * hx);
|
|
914
914
|
si.vertexNormal = normalize(aD * si.vertexNormal);
|
|
915
915
|
si.normal = normalize(aD * si.normal);
|
|
916
916
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
@@ -931,7 +931,7 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
931
931
|
}
|
|
932
932
|
|
|
933
933
|
|
|
934
|
-
void
|
|
934
|
+
void iH(in Ray ray, inout ad si, int instanceIndex, float maxDistance) {
|
|
935
935
|
si.hit = false;
|
|
936
936
|
|
|
937
937
|
if (isEmptyScene) {
|
|
@@ -940,16 +940,16 @@ return;
|
|
|
940
940
|
|
|
941
941
|
bool doubleSided = true;
|
|
942
942
|
int ey = maxDimension(abs(ray.d));
|
|
943
|
-
vec3
|
|
943
|
+
vec3 gL = mj(ray.d, ey);
|
|
944
944
|
int ao;
|
|
945
945
|
|
|
946
946
|
${getBVHTraverseCode(glsl `
|
|
947
947
|
si.triangleIndex = triangleIndex;
|
|
948
|
-
|
|
949
|
-
|
|
948
|
+
lp = tri;
|
|
949
|
+
hx = faceNormal;
|
|
950
950
|
aB = hit.barycentric;
|
|
951
951
|
hs = index;
|
|
952
|
-
|
|
952
|
+
qT = true;
|
|
953
953
|
ao = cf;
|
|
954
954
|
`, glsl `
|
|
955
955
|
if (cf != instanceIndex) {
|
|
@@ -957,10 +957,10 @@ continue;
|
|
|
957
957
|
}
|
|
958
958
|
`, 'maxDistance')}
|
|
959
959
|
|
|
960
|
-
if (
|
|
960
|
+
if (qT) {
|
|
961
961
|
si.instanceIndex = ao;
|
|
962
962
|
si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
963
|
-
hp(si,
|
|
963
|
+
hp(si, lp, aB, hs);
|
|
964
964
|
mat4 l2w = mat4(
|
|
965
965
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
|
|
966
966
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
|
|
@@ -974,7 +974,7 @@ bv(ao * ${INSTANCE_VEC4_STRIDE} + 3),
|
|
|
974
974
|
bv(ao * ${INSTANCE_VEC4_STRIDE} + 4)
|
|
975
975
|
);
|
|
976
976
|
mat3 aD = transpose(mat3(w2l));
|
|
977
|
-
si.faceNormal = normalize(aD *
|
|
977
|
+
si.faceNormal = normalize(aD * hx);
|
|
978
978
|
si.vertexNormal = normalize(aD * si.vertexNormal);
|
|
979
979
|
si.normal = normalize(aD * si.normal);
|
|
980
980
|
#ifdef NUM_COAT_NORMAL_MAPS
|
|
@@ -994,7 +994,7 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
|
|
|
994
994
|
}
|
|
995
995
|
}
|
|
996
996
|
|
|
997
|
-
bool ex(in Ray ray, float lightDistance, int
|
|
997
|
+
bool ex(in Ray ray, float lightDistance, int jG) {
|
|
998
998
|
|
|
999
999
|
if (isEmptyScene) {
|
|
1000
1000
|
return false;
|
|
@@ -1002,21 +1002,21 @@ return false;
|
|
|
1002
1002
|
|
|
1003
1003
|
bool doubleSided = true;
|
|
1004
1004
|
int ey = maxDimension(abs(ray.d));
|
|
1005
|
-
vec3
|
|
1005
|
+
vec3 gL = mj(ray.d, ey);
|
|
1006
1006
|
|
|
1007
1007
|
${getBVHTraverseCode(glsl `
|
|
1008
1008
|
|
|
1009
1009
|
|
|
1010
|
-
bool
|
|
1010
|
+
bool jn = true;
|
|
1011
1011
|
vec3 barycentric = hit.barycentric;
|
|
1012
1012
|
vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
|
|
1013
1013
|
|
|
1014
|
-
if (
|
|
1014
|
+
if (jn) {
|
|
1015
1015
|
#ifdef HAS_ALPHA
|
|
1016
1016
|
int materialIndex = int(ae(floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)).x);
|
|
1017
|
-
ivec2 i0 =
|
|
1018
|
-
ivec2 i1 =
|
|
1019
|
-
ivec2 i2 =
|
|
1017
|
+
ivec2 i0 = gM(index.x, vertexColumns);
|
|
1018
|
+
ivec2 i1 = gM(index.y, vertexColumns);
|
|
1019
|
+
ivec2 i2 = gM(index.z, vertexColumns);
|
|
1020
1020
|
ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
|
|
1021
1021
|
ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
|
|
1022
1022
|
ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
|
|
@@ -1036,12 +1036,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1036
1036
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1037
1037
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1038
1038
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1039
|
-
vec4
|
|
1040
|
-
int uvProjection = int(
|
|
1039
|
+
vec4 lC = fetchMatData(ii + MAT_ROW_UV);
|
|
1040
|
+
int uvProjection = int(lC.r);
|
|
1041
1041
|
if (uvProjection > 0) {
|
|
1042
|
-
uv =
|
|
1042
|
+
uv = gC(uvProjection, position, hx, lC.zw);
|
|
1043
1043
|
} else {
|
|
1044
|
-
uv *=
|
|
1044
|
+
uv *= lC.zw;
|
|
1045
1045
|
}
|
|
1046
1046
|
|
|
1047
1047
|
alpha *= sampleMap(diffuseMapIndex, uv).a;
|
|
@@ -1055,32 +1055,32 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
|
|
|
1055
1055
|
vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
|
|
1056
1056
|
vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
|
|
1057
1057
|
vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
|
|
1058
|
-
vec4
|
|
1059
|
-
int uvProjection = int(
|
|
1058
|
+
vec4 lC = fetchMatData(ii + MAT_ROW_UV);
|
|
1059
|
+
int uvProjection = int(lC.r);
|
|
1060
1060
|
if (uvProjection > 0) {
|
|
1061
|
-
uv =
|
|
1061
|
+
uv = gC(uvProjection, position, hx, lC.zw);
|
|
1062
1062
|
} else {
|
|
1063
|
-
uv *=
|
|
1063
|
+
uv *= lC.zw;
|
|
1064
1064
|
}
|
|
1065
1065
|
alpha *= sampleMap(alphaMapIndex, uv).g;
|
|
1066
1066
|
}
|
|
1067
1067
|
#endif
|
|
1068
1068
|
float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
|
|
1069
|
-
alpha =
|
|
1069
|
+
alpha = lg(
|
|
1070
1070
|
alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
|
|
1071
1071
|
);
|
|
1072
1072
|
if (eo(0u) > alpha) {
|
|
1073
1073
|
|
|
1074
1074
|
tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1075
|
-
|
|
1075
|
+
jn = false;
|
|
1076
1076
|
}
|
|
1077
1077
|
#endif
|
|
1078
1078
|
}
|
|
1079
|
-
if (
|
|
1079
|
+
if (jn) {
|
|
1080
1080
|
return true;
|
|
1081
1081
|
}
|
|
1082
1082
|
`, glsl `
|
|
1083
|
-
if (triangleIndex ==
|
|
1083
|
+
if (triangleIndex == jG) {
|
|
1084
1084
|
continue;
|
|
1085
1085
|
}
|
|
1086
1086
|
`, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}
|