@ifc-lite/renderer 1.1.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/pipeline.js CHANGED
@@ -3,10 +3,17 @@
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  export class RenderPipeline {
5
5
  device;
6
+ webgpuDevice;
6
7
  pipeline;
7
8
  selectionPipeline; // Pipeline for selected meshes (renders on top)
9
+ transparentPipeline; // Pipeline for transparent meshes with alpha blending
8
10
  depthTexture;
9
11
  depthTextureView;
12
+ depthFormat = 'depth24plus';
13
+ colorFormat;
14
+ multisampleTexture = null;
15
+ multisampleTextureView = null;
16
+ sampleCount = 4; // MSAA sample count
10
17
  uniformBuffer;
11
18
  bindGroup;
12
19
  bindGroupLayout; // Explicit layout shared between pipelines
@@ -15,15 +22,31 @@ export class RenderPipeline {
15
22
  constructor(device, width = 1, height = 1) {
16
23
  this.currentWidth = width;
17
24
  this.currentHeight = height;
25
+ this.webgpuDevice = device;
18
26
  this.device = device.getDevice();
19
- const format = device.getFormat();
20
- // Create depth texture
27
+ this.colorFormat = device.getFormat();
28
+ // Check MSAA support and adjust sample count
29
+ // 4x MSAA provides good anti-aliasing for thin geometry
30
+ const maxSampleCount = this.device.limits?.maxSampleCount ?? 4;
31
+ this.sampleCount = Math.min(4, maxSampleCount);
32
+ // Create depth texture with MSAA support
21
33
  this.depthTexture = this.device.createTexture({
22
34
  size: { width, height },
23
35
  format: 'depth24plus',
24
36
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
37
+ sampleCount: this.sampleCount > 1 ? this.sampleCount : 1,
25
38
  });
26
39
  this.depthTextureView = this.depthTexture.createView();
40
+ // Create multisample color texture for MSAA
41
+ if (this.sampleCount > 1) {
42
+ this.multisampleTexture = this.device.createTexture({
43
+ size: { width, height },
44
+ format: this.colorFormat,
45
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
46
+ sampleCount: this.sampleCount,
47
+ });
48
+ this.multisampleTextureView = this.multisampleTexture.createView();
49
+ }
27
50
  // Create uniform buffer for camera matrices, PBR material, and section plane
28
51
  // Layout: viewProj (64 bytes) + model (64 bytes) + baseColor (16 bytes) + metallicRoughness (8 bytes) +
29
52
  // sectionPlane (16 bytes: vec3 normal + float position) + flags (16 bytes: u32 isSelected + u32 sectionEnabled + padding) = 192 bytes
@@ -66,6 +89,7 @@ export class RenderPipeline {
66
89
  @location(0) worldPos: vec3<f32>,
67
90
  @location(1) normal: vec3<f32>,
68
91
  @location(2) @interpolate(flat) objectId: u32,
92
+ @location(3) viewPos: vec3<f32>, // For edge detection
69
93
  }
70
94
 
71
95
  @vertex
@@ -76,6 +100,8 @@ export class RenderPipeline {
76
100
  output.worldPos = worldPos.xyz;
77
101
  output.normal = normalize((uniforms.model * vec4<f32>(input.normal, 0.0)).xyz);
78
102
  output.objectId = instanceIndex;
103
+ // Store view-space position for edge detection
104
+ output.viewPos = (uniforms.viewProj * worldPos).xyz;
79
105
  return output;
80
106
  }
81
107
 
@@ -121,34 +147,123 @@ export class RenderPipeline {
121
147
  }
122
148
 
123
149
  let N = normalize(input.normal);
124
- let L = normalize(vec3<f32>(0.5, 1.0, 0.3)); // Light direction
150
+
151
+ // Enhanced lighting with multiple sources
152
+ let sunLight = normalize(vec3<f32>(0.5, 1.0, 0.3)); // Main directional light
153
+ let fillLight = normalize(vec3<f32>(-0.5, 0.3, -0.3)); // Fill light
154
+ let rimLight = normalize(vec3<f32>(0.0, 0.2, -1.0)); // Rim light for edge definition
125
155
 
126
- let NdotL = max(dot(N, L), 0.0);
156
+ // Hemisphere ambient - reduced for less washed-out look
157
+ let skyColor = vec3<f32>(0.3, 0.35, 0.4); // Darker sky
158
+ let groundColor = vec3<f32>(0.15, 0.1, 0.08); // Darker ground
159
+ let hemisphereFactor = N.y * 0.5 + 0.5;
160
+ let ambient = mix(groundColor, skyColor, hemisphereFactor) * 0.25;
127
161
 
128
- var baseColor = uniforms.baseColor.rgb;
162
+ // Main sun light - reduced intensity, tighter wrap for more contrast
163
+ let NdotL = max(dot(N, sunLight), 0.0);
164
+ let wrap = 0.3; // Tighter wrap for more contrast
165
+ let diffuseSun = max((NdotL + wrap) / (1.0 + wrap), 0.0) * 0.55;
166
+
167
+ // Fill light - reduced
168
+ let NdotFill = max(dot(N, fillLight), 0.0);
169
+ let diffuseFill = NdotFill * 0.15;
129
170
 
130
- // Simple diffuse lighting with ambient
131
- let ambient = 0.3;
132
- let diffuse = NdotL * 0.7;
171
+ // Rim light for edge definition
172
+ let NdotRim = max(dot(N, rimLight), 0.0);
173
+ let rim = pow(NdotRim, 4.0) * 0.15;
133
174
 
134
- var color = baseColor * (ambient + diffuse);
175
+ var baseColor = uniforms.baseColor.rgb;
176
+
177
+ // Detect if the color is close to white/gray (low saturation)
178
+ let baseGray = dot(baseColor, vec3<f32>(0.299, 0.587, 0.114));
179
+ let baseSaturation = length(baseColor - vec3<f32>(baseGray)) / max(baseGray, 0.001);
180
+ let isWhiteish = 1.0 - smoothstep(0.0, 0.3, baseSaturation);
181
+
182
+ // Darken whites/grays more to reduce washed-out appearance
183
+ baseColor = mix(baseColor, baseColor * 0.7, isWhiteish * 0.4);
184
+
185
+ // Combine all lighting
186
+ var color = baseColor * (ambient + diffuseSun + diffuseFill + rim);
135
187
 
136
188
  // Selection highlight - add glow/fresnel effect
137
189
  if (uniforms.flags.x == 1u) {
138
- // Calculate view direction for fresnel effect
139
- let V = normalize(-input.worldPos); // Assuming camera at origin (simplified)
190
+ let V = normalize(-input.worldPos);
140
191
  let NdotV = max(dot(N, V), 0.0);
141
-
142
- // Fresnel-like edge highlight for selection
143
192
  let fresnel = pow(1.0 - NdotV, 2.0);
144
- let highlightColor = vec3<f32>(0.3, 0.6, 1.0); // Blue highlight
193
+ let highlightColor = vec3<f32>(0.3, 0.6, 1.0);
145
194
  color = mix(color, highlightColor, fresnel * 0.5 + 0.2);
146
195
  }
147
196
 
148
- // Gamma correction (IFC colors are typically in sRGB)
197
+ // Beautiful fresnel effect for transparent materials (glass)
198
+ var finalAlpha = uniforms.baseColor.a;
199
+ if (finalAlpha < 0.99) {
200
+ // Calculate view direction for fresnel
201
+ let V = normalize(-input.worldPos);
202
+ let NdotV = max(dot(N, V), 0.0);
203
+
204
+ // Enhanced fresnel effect - stronger at edges (grazing angles)
205
+ // Using Schlick's approximation for realistic glass reflection
206
+ let fresnelPower = 1.5; // Higher = softer edge reflections
207
+ let fresnel = pow(1.0 - NdotV, fresnelPower);
208
+
209
+ // Glass reflection tint (sky/environment reflection at edges)
210
+ let reflectionTint = vec3<f32>(0.92, 0.96, 1.0); // Cool sky reflection
211
+ let reflectionStrength = fresnel * 0.6; // Strong edge reflections
212
+
213
+ // Mix in reflection tint at edges
214
+ color = mix(color, color * reflectionTint, reflectionStrength);
215
+
216
+ // Add realistic glass shine - brighter at edges where light reflects
217
+ let glassShine = fresnel * 0.12;
218
+ color += glassShine;
219
+
220
+ // Slight desaturation at edges (glass reflects environment, not just color)
221
+ let edgeDesaturation = fresnel * 0.25;
222
+ let gray = dot(color, vec3<f32>(0.299, 0.587, 0.114));
223
+ color = mix(color, vec3<f32>(gray), edgeDesaturation);
224
+
225
+ // Make glass more transparent (reduce opacity by 30%)
226
+ finalAlpha = finalAlpha * 0.7;
227
+ }
228
+
229
+ // Exposure adjustment - darken overall
230
+ color *= 0.85;
231
+
232
+ // Contrast enhancement
233
+ color = (color - 0.5) * 1.15 + 0.5;
234
+ color = max(color, vec3<f32>(0.0));
235
+
236
+ // Saturation boost - stronger for colored surfaces, less for whites
237
+ let gray = dot(color, vec3<f32>(0.299, 0.587, 0.114));
238
+ let satBoost = mix(1.4, 1.1, isWhiteish); // More saturation for colored surfaces
239
+ color = mix(vec3<f32>(gray), color, satBoost);
240
+
241
+ // ACES filmic tone mapping
242
+ let a = 2.51;
243
+ let b = 0.03;
244
+ let c = 2.43;
245
+ let d = 0.59;
246
+ let e = 0.14;
247
+ color = clamp((color * (a * color + b)) / (color * (c * color + d) + e), vec3<f32>(0.0), vec3<f32>(1.0));
248
+
249
+ // Subtle edge enhancement using screen-space derivatives
250
+ let depthGradient = length(vec2<f32>(
251
+ dpdx(input.viewPos.z),
252
+ dpdy(input.viewPos.z)
253
+ ));
254
+ let normalGradient = length(vec2<f32>(
255
+ length(dpdx(input.normal)),
256
+ length(dpdy(input.normal))
257
+ ));
258
+
259
+ let edgeFactor = smoothstep(0.0, 0.1, depthGradient * 10.0 + normalGradient * 5.0);
260
+ let edgeDarken = mix(1.0, 0.92, edgeFactor * 0.4); // Slightly stronger edge darkening
261
+ color *= edgeDarken;
262
+
263
+ // Gamma correction
149
264
  color = pow(color, vec3<f32>(1.0 / 2.2));
150
265
 
151
- return vec4<f32>(color, uniforms.baseColor.a);
266
+ return vec4<f32>(color, finalAlpha);
152
267
  }
153
268
  `,
154
269
  });
@@ -156,8 +271,8 @@ export class RenderPipeline {
156
271
  const pipelineLayout = this.device.createPipelineLayout({
157
272
  bindGroupLayouts: [this.bindGroupLayout],
158
273
  });
159
- // Create render pipeline with explicit layout
160
- this.pipeline = this.device.createRenderPipeline({
274
+ // Create render pipeline descriptor
275
+ const pipelineDescriptor = {
161
276
  layout: pipelineLayout,
162
277
  vertex: {
163
278
  module: shaderModule,
@@ -175,22 +290,25 @@ export class RenderPipeline {
175
290
  fragment: {
176
291
  module: shaderModule,
177
292
  entryPoint: 'fs_main',
178
- targets: [{ format }],
293
+ targets: [{ format: this.colorFormat }],
179
294
  },
180
295
  primitive: {
181
296
  topology: 'triangle-list',
182
297
  cullMode: 'none', // Disable culling to debug - IFC winding order varies
183
298
  },
184
299
  depthStencil: {
185
- format: 'depth24plus',
300
+ format: this.depthFormat,
186
301
  depthWriteEnabled: true,
187
- depthCompare: 'less',
302
+ depthCompare: 'greater', // Reverse-Z: greater instead of less
188
303
  },
189
- });
190
- // Create selection pipeline with less-equal depth compare to render selected meshes on top
191
- // This allows selected meshes to overdraw at the same depth as batched meshes
192
- // IMPORTANT: Use explicit layout to share bind groups with main pipeline
193
- this.selectionPipeline = this.device.createRenderPipeline({
304
+ // MSAA configuration - must match render pass attachment sample count
305
+ multisample: {
306
+ count: this.sampleCount,
307
+ },
308
+ };
309
+ this.pipeline = this.device.createRenderPipeline(pipelineDescriptor);
310
+ // Create selection pipeline descriptor
311
+ const selectionPipelineDescriptor = {
194
312
  layout: pipelineLayout,
195
313
  vertex: {
196
314
  module: shaderModule,
@@ -208,20 +326,73 @@ export class RenderPipeline {
208
326
  fragment: {
209
327
  module: shaderModule,
210
328
  entryPoint: 'fs_main',
211
- targets: [{ format }],
329
+ targets: [{ format: this.colorFormat }],
212
330
  },
213
331
  primitive: {
214
332
  topology: 'triangle-list',
215
333
  cullMode: 'none',
216
334
  },
217
335
  depthStencil: {
218
- format: 'depth24plus',
219
- depthWriteEnabled: true,
220
- depthCompare: 'less-equal', // Allow overdraw at same depth
221
- depthBias: -1, // Small bias to ensure selection renders in front
222
- depthBiasSlopeScale: -1,
336
+ format: this.depthFormat,
337
+ depthWriteEnabled: false, // Don't overwrite depth - selected objects render on top of existing depth
338
+ depthCompare: 'greater-equal', // Allow rendering at same depth, but still respect objects in front
339
+ depthBias: 0,
340
+ depthBiasSlopeScale: 0,
223
341
  },
224
- });
342
+ // MSAA configuration - must match render pass attachment sample count
343
+ multisample: {
344
+ count: this.sampleCount,
345
+ },
346
+ };
347
+ this.selectionPipeline = this.device.createRenderPipeline(selectionPipelineDescriptor);
348
+ // Create transparent pipeline descriptor (same shader, but with alpha blending)
349
+ const transparentPipelineDescriptor = {
350
+ layout: pipelineLayout,
351
+ vertex: {
352
+ module: shaderModule,
353
+ entryPoint: 'vs_main',
354
+ buffers: [
355
+ {
356
+ arrayStride: 24,
357
+ attributes: [
358
+ { shaderLocation: 0, offset: 0, format: 'float32x3' },
359
+ { shaderLocation: 1, offset: 12, format: 'float32x3' },
360
+ ],
361
+ },
362
+ ],
363
+ },
364
+ fragment: {
365
+ module: shaderModule,
366
+ entryPoint: 'fs_main',
367
+ targets: [{
368
+ format: this.colorFormat,
369
+ blend: {
370
+ color: {
371
+ srcFactor: 'src-alpha',
372
+ dstFactor: 'one-minus-src-alpha',
373
+ },
374
+ alpha: {
375
+ srcFactor: 'one',
376
+ dstFactor: 'one-minus-src-alpha',
377
+ },
378
+ },
379
+ }],
380
+ },
381
+ primitive: {
382
+ topology: 'triangle-list',
383
+ cullMode: 'none',
384
+ },
385
+ depthStencil: {
386
+ format: this.depthFormat,
387
+ depthWriteEnabled: false, // Don't write depth for transparent objects
388
+ depthCompare: 'greater', // Still test depth to respect opaque objects
389
+ },
390
+ // MSAA configuration - must match render pass attachment sample count
391
+ multisample: {
392
+ count: this.sampleCount,
393
+ },
394
+ };
395
+ this.transparentPipeline = this.device.createRenderPipeline(transparentPipelineDescriptor);
225
396
  // Create bind group using the explicit bind group layout
226
397
  this.bindGroup = this.device.createBindGroup({
227
398
  layout: this.bindGroupLayout,
@@ -292,10 +463,28 @@ export class RenderPipeline {
292
463
  this.depthTexture.destroy();
293
464
  this.depthTexture = this.device.createTexture({
294
465
  size: { width, height },
295
- format: 'depth24plus',
466
+ format: this.depthFormat,
296
467
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
468
+ sampleCount: this.sampleCount > 1 ? this.sampleCount : 1,
297
469
  });
298
470
  this.depthTextureView = this.depthTexture.createView();
471
+ // Recreate multisample texture
472
+ if (this.multisampleTexture) {
473
+ this.multisampleTexture.destroy();
474
+ }
475
+ if (this.sampleCount > 1) {
476
+ this.multisampleTexture = this.device.createTexture({
477
+ size: { width, height },
478
+ format: this.colorFormat,
479
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
480
+ sampleCount: this.sampleCount,
481
+ });
482
+ this.multisampleTextureView = this.multisampleTexture.createView();
483
+ }
484
+ else {
485
+ this.multisampleTexture = null;
486
+ this.multisampleTextureView = null;
487
+ }
299
488
  }
300
489
  getPipeline() {
301
490
  return this.pipeline;
@@ -303,9 +492,24 @@ export class RenderPipeline {
303
492
  getSelectionPipeline() {
304
493
  return this.selectionPipeline;
305
494
  }
495
+ getTransparentPipeline() {
496
+ return this.transparentPipeline;
497
+ }
306
498
  getDepthTextureView() {
307
499
  return this.depthTextureView;
308
500
  }
501
+ /**
502
+ * Get multisample texture view (for MSAA rendering)
503
+ */
504
+ getMultisampleTextureView() {
505
+ return this.multisampleTextureView;
506
+ }
507
+ /**
508
+ * Get sample count
509
+ */
510
+ getSampleCount() {
511
+ return this.sampleCount;
512
+ }
309
513
  getBindGroup() {
310
514
  return this.bindGroup;
311
515
  }
@@ -326,11 +530,12 @@ export class InstancedRenderPipeline {
326
530
  depthTexture;
327
531
  depthTextureView;
328
532
  uniformBuffer;
533
+ colorFormat;
329
534
  currentHeight;
330
535
  constructor(device, width = 1, height = 1) {
331
536
  this.currentHeight = height;
332
537
  this.device = device.getDevice();
333
- const format = device.getFormat();
538
+ this.colorFormat = device.getFormat();
334
539
  // Create depth texture
335
540
  this.depthTexture = this.device.createTexture({
336
541
  size: { width, height },
@@ -371,6 +576,7 @@ export class InstancedRenderPipeline {
371
576
  @location(1) normal: vec3<f32>,
372
577
  @location(2) color: vec4<f32>,
373
578
  @location(3) @interpolate(flat) instanceId: u32,
579
+ @location(4) viewPos: vec3<f32>, // For edge detection
374
580
  }
375
581
 
376
582
  // Z-up to Y-up conversion matrix (IFC uses Z-up, WebGPU/viewer uses Y-up)
@@ -400,6 +606,8 @@ export class InstancedRenderPipeline {
400
606
  output.normal = normalize(normalYUp);
401
607
  output.color = inst.color;
402
608
  output.instanceId = instanceIndex;
609
+ // Store view-space position for edge detection
610
+ output.viewPos = (uniforms.viewProj * worldPos).xyz;
403
611
  return output;
404
612
  }
405
613
 
@@ -416,22 +624,114 @@ export class InstancedRenderPipeline {
416
624
  }
417
625
 
418
626
  let N = normalize(input.normal);
419
- let L = normalize(vec3<f32>(0.5, 1.0, 0.3)); // Light direction
627
+
628
+ // Enhanced lighting with multiple sources
629
+ let sunLight = normalize(vec3<f32>(0.5, 1.0, 0.3)); // Main directional light
630
+ let fillLight = normalize(vec3<f32>(-0.5, 0.3, -0.3)); // Fill light
631
+ let rimLight = normalize(vec3<f32>(0.0, 0.2, -1.0)); // Rim light for edge definition
420
632
 
421
- let NdotL = max(dot(N, L), 0.0);
633
+ // Hemisphere ambient - reduced for less washed-out look
634
+ let skyColor = vec3<f32>(0.3, 0.35, 0.4); // Darker sky
635
+ let groundColor = vec3<f32>(0.15, 0.1, 0.08); // Darker ground
636
+ let hemisphereFactor = N.y * 0.5 + 0.5;
637
+ let ambient = mix(groundColor, skyColor, hemisphereFactor) * 0.25;
638
+
639
+ // Main sun light - reduced intensity, tighter wrap for more contrast
640
+ let NdotL = max(dot(N, sunLight), 0.0);
641
+ let wrap = 0.3; // Tighter wrap for more contrast
642
+ let diffuseSun = max((NdotL + wrap) / (1.0 + wrap), 0.0) * 0.55;
643
+
644
+ // Fill light - reduced
645
+ let NdotFill = max(dot(N, fillLight), 0.0);
646
+ let diffuseFill = NdotFill * 0.15;
647
+
648
+ // Rim light for edge definition
649
+ let NdotRim = max(dot(N, rimLight), 0.0);
650
+ let rim = pow(NdotRim, 4.0) * 0.15;
422
651
 
423
652
  var baseColor = input.color.rgb;
653
+
654
+ // Detect if the color is close to white/gray (low saturation)
655
+ let baseGray = dot(baseColor, vec3<f32>(0.299, 0.587, 0.114));
656
+ let baseSaturation = length(baseColor - vec3<f32>(baseGray)) / max(baseGray, 0.001);
657
+ let isWhiteish = 1.0 - smoothstep(0.0, 0.3, baseSaturation);
658
+
659
+ // Darken whites/grays more to reduce washed-out appearance
660
+ baseColor = mix(baseColor, baseColor * 0.7, isWhiteish * 0.4);
424
661
 
425
- // Simple diffuse lighting with ambient
426
- let ambient = 0.3;
427
- let diffuse = NdotL * 0.7;
662
+ // Combine all lighting
663
+ var color = baseColor * (ambient + diffuseSun + diffuseFill + rim);
428
664
 
429
- var color = baseColor * (ambient + diffuse);
665
+ // Beautiful fresnel effect for transparent materials (glass)
666
+ var finalAlpha = input.color.a;
667
+ if (finalAlpha < 0.99) {
668
+ // Calculate view direction for fresnel
669
+ let V = normalize(-input.worldPos);
670
+ let NdotV = max(dot(N, V), 0.0);
671
+
672
+ // Enhanced fresnel effect - stronger at edges (grazing angles)
673
+ // Using Schlick's approximation for realistic glass reflection
674
+ let fresnelPower = 1.5; // Higher = softer edge reflections
675
+ let fresnel = pow(1.0 - NdotV, fresnelPower);
676
+
677
+ // Glass reflection tint (sky/environment reflection at edges)
678
+ let reflectionTint = vec3<f32>(0.92, 0.96, 1.0); // Cool sky reflection
679
+ let reflectionStrength = fresnel * 0.6; // Strong edge reflections
680
+
681
+ // Mix in reflection tint at edges
682
+ color = mix(color, color * reflectionTint, reflectionStrength);
683
+
684
+ // Add realistic glass shine - brighter at edges where light reflects
685
+ let glassShine = fresnel * 0.12;
686
+ color += glassShine;
687
+
688
+ // Slight desaturation at edges (glass reflects environment, not just color)
689
+ let edgeDesaturation = fresnel * 0.25;
690
+ let gray = dot(color, vec3<f32>(0.299, 0.587, 0.114));
691
+ color = mix(color, vec3<f32>(gray), edgeDesaturation);
692
+
693
+ // Make glass more transparent (reduce opacity by 30%)
694
+ finalAlpha = finalAlpha * 0.7;
695
+ }
696
+
697
+ // Exposure adjustment - darken overall
698
+ color *= 0.85;
699
+
700
+ // Contrast enhancement
701
+ color = (color - 0.5) * 1.15 + 0.5;
702
+ color = max(color, vec3<f32>(0.0));
703
+
704
+ // Saturation boost - stronger for colored surfaces, less for whites
705
+ let gray = dot(color, vec3<f32>(0.299, 0.587, 0.114));
706
+ let satBoost = mix(1.4, 1.1, isWhiteish); // More saturation for colored surfaces
707
+ color = mix(vec3<f32>(gray), color, satBoost);
430
708
 
431
- // Gamma correction (IFC colors are typically in sRGB)
709
+ // ACES filmic tone mapping
710
+ let a = 2.51;
711
+ let b = 0.03;
712
+ let c = 2.43;
713
+ let d = 0.59;
714
+ let e = 0.14;
715
+ color = clamp((color * (a * color + b)) / (color * (c * color + d) + e), vec3<f32>(0.0), vec3<f32>(1.0));
716
+
717
+ // Subtle edge enhancement using screen-space derivatives
718
+ let depthGradient = length(vec2<f32>(
719
+ dpdx(input.viewPos.z),
720
+ dpdy(input.viewPos.z)
721
+ ));
722
+ let normalGradient = length(vec2<f32>(
723
+ length(dpdx(input.normal)),
724
+ length(dpdy(input.normal))
725
+ ));
726
+
727
+ let edgeFactor = smoothstep(0.0, 0.1, depthGradient * 10.0 + normalGradient * 5.0);
728
+ let edgeDarken = mix(1.0, 0.92, edgeFactor * 0.4); // Slightly stronger edge darkening
729
+ color *= edgeDarken;
730
+
731
+ // Gamma correction
432
732
  color = pow(color, vec3<f32>(1.0 / 2.2));
433
733
 
434
- return vec4<f32>(color, input.color.a);
734
+ return vec4<f32>(color, finalAlpha);
435
735
  }
436
736
  `,
437
737
  });
@@ -454,16 +754,16 @@ export class InstancedRenderPipeline {
454
754
  fragment: {
455
755
  module: shaderModule,
456
756
  entryPoint: 'fs_main',
457
- targets: [{ format }],
757
+ targets: [{ format: this.colorFormat }],
458
758
  },
459
759
  primitive: {
460
760
  topology: 'triangle-list',
461
761
  cullMode: 'none',
462
762
  },
463
763
  depthStencil: {
464
- format: 'depth24plus',
764
+ format: 'depth24plus', // Will be updated if reverse-Z is enabled
465
765
  depthWriteEnabled: true,
466
- depthCompare: 'less',
766
+ depthCompare: 'greater', // Reverse-Z: greater instead of less
467
767
  },
468
768
  });
469
769
  // Note: bind groups are created per-instanced-mesh via createInstanceBindGroup()
@@ -503,7 +803,7 @@ export class InstancedRenderPipeline {
503
803
  this.depthTexture.destroy();
504
804
  this.depthTexture = this.device.createTexture({
505
805
  size: { width, height },
506
- format: 'depth24plus',
806
+ format: 'depth24plus', // Default format for instanced pipeline
507
807
  usage: GPUTextureUsage.RENDER_ATTACHMENT,
508
808
  });
509
809
  this.depthTextureView = this.depthTexture.createView();
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}