@@ -62,7 +62,14 @@ fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
62
62
20 , 21 , 22 , 22 , 23 , 20 , // back
63
63
] ;
64
64
65
- ( vertex_data. to_vec ( ) , index_data. to_vec ( ) )
65
+ (
66
+ vertex_data. to_vec ( ) ,
67
+ std:: iter:: repeat ( index_data)
68
+ . flatten ( )
69
+ . take ( 153 * 3 )
70
+ . cloned ( )
71
+ . collect ( ) ,
72
+ )
66
73
}
67
74
68
75
#[ repr( C ) ]
@@ -98,6 +105,7 @@ struct Example {
98
105
uniforms : Uniforms ,
99
106
uniform_buf : wgpu:: Buffer ,
100
107
blas : wgpu:: Blas ,
108
+ blas_with_one_too_much_triangles : wgpu:: Blas ,
101
109
tlas_package : wgpu:: TlasPackage ,
102
110
pipeline : wgpu:: RenderPipeline ,
103
111
bind_group : wgpu:: BindGroup ,
@@ -164,11 +172,11 @@ impl crate::framework::Example for Example {
164
172
usage : wgpu:: BufferUsages :: INDEX | wgpu:: BufferUsages :: BLAS_INPUT ,
165
173
} ) ;
166
174
167
- let blas_geo_size_desc = wgpu:: BlasTriangleGeometrySizeDescriptor {
175
+ let mut blas_geo_size_desc = wgpu:: BlasTriangleGeometrySizeDescriptor {
168
176
vertex_format : wgpu:: VertexFormat :: Float32x3 ,
169
177
vertex_count : vertex_data. len ( ) as u32 ,
170
178
index_format : Some ( wgpu:: IndexFormat :: Uint16 ) ,
171
- index_count : Some ( index_data. len ( ) as u32 ) ,
179
+ index_count : Some ( index_data. len ( ) as u32 - 3 ) ,
172
180
flags : wgpu:: AccelerationStructureGeometryFlags :: OPAQUE ,
173
181
} ;
174
182
@@ -183,6 +191,25 @@ impl crate::framework::Example for Example {
183
191
} ,
184
192
) ;
185
193
194
+ let mut blas_geo_size_desc_2 = wgpu:: BlasTriangleGeometrySizeDescriptor {
195
+ vertex_format : wgpu:: VertexFormat :: Float32x3 ,
196
+ vertex_count : vertex_data. len ( ) as u32 ,
197
+ index_format : Some ( wgpu:: IndexFormat :: Uint16 ) ,
198
+ index_count : Some ( index_data. len ( ) as u32 ) ,
199
+ flags : wgpu:: AccelerationStructureGeometryFlags :: OPAQUE ,
200
+ } ;
201
+
202
+ let blas_with_one_too_much_triangles = device. create_blas (
203
+ & wgpu:: CreateBlasDescriptor {
204
+ label : None ,
205
+ flags : wgpu:: AccelerationStructureFlags :: PREFER_FAST_TRACE ,
206
+ update_mode : wgpu:: AccelerationStructureUpdateMode :: Build ,
207
+ } ,
208
+ wgpu:: BlasGeometrySizeDescriptors :: Triangles {
209
+ descriptors : vec ! [ blas_geo_size_desc_2. clone( ) ] ,
210
+ } ,
211
+ ) ;
212
+
186
213
let tlas = device. create_tlas ( & wgpu:: CreateTlasDescriptor {
187
214
label : None ,
188
215
flags : wgpu:: AccelerationStructureFlags :: PREFER_FAST_TRACE ,
@@ -243,22 +270,38 @@ impl crate::framework::Example for Example {
243
270
device. create_command_encoder ( & wgpu:: CommandEncoderDescriptor { label : None } ) ;
244
271
245
272
encoder. build_acceleration_structures (
246
- iter:: once ( & wgpu:: BlasBuildEntry {
247
- blas : & blas,
248
- geometry : wgpu:: BlasGeometries :: TriangleGeometries ( vec ! [
249
- wgpu:: BlasTriangleGeometry {
250
- size: & blas_geo_size_desc,
251
- vertex_buffer: & vertex_buf,
252
- first_vertex: 0 ,
253
- vertex_stride: mem:: size_of:: <Vertex >( ) as u64 ,
254
- index_buffer: Some ( & index_buf) ,
255
- first_index: Some ( 0 ) ,
256
- transform_buffer: None ,
257
- transform_buffer_offset: None ,
258
- } ,
259
- ] ) ,
260
- } ) ,
261
- // iter::empty(),
273
+ vec ! [
274
+ & wgpu:: BlasBuildEntry {
275
+ blas: & blas,
276
+ geometry: wgpu:: BlasGeometries :: TriangleGeometries ( vec![
277
+ wgpu:: BlasTriangleGeometry {
278
+ size: & blas_geo_size_desc,
279
+ vertex_buffer: & vertex_buf,
280
+ first_vertex: 0 ,
281
+ vertex_stride: mem:: size_of:: <Vertex >( ) as u64 ,
282
+ index_buffer: Some ( & index_buf) ,
283
+ first_index: Some ( 0 ) ,
284
+ transform_buffer: None ,
285
+ transform_buffer_offset: None ,
286
+ } ,
287
+ ] ) ,
288
+ } ,
289
+ & wgpu:: BlasBuildEntry {
290
+ blas: & blas_with_one_too_much_triangles,
291
+ geometry: wgpu:: BlasGeometries :: TriangleGeometries ( vec![
292
+ wgpu:: BlasTriangleGeometry {
293
+ size: & blas_geo_size_desc_2,
294
+ vertex_buffer: & vertex_buf,
295
+ first_vertex: 0 ,
296
+ vertex_stride: mem:: size_of:: <Vertex >( ) as u64 ,
297
+ index_buffer: Some ( & index_buf) ,
298
+ first_index: Some ( 0 ) ,
299
+ transform_buffer: None ,
300
+ transform_buffer_offset: None ,
301
+ } ,
302
+ ] ) ,
303
+ } ,
304
+ ] ,
262
305
iter:: once ( & tlas_package) ,
263
306
) ;
264
307
@@ -270,6 +313,7 @@ impl crate::framework::Example for Example {
270
313
uniforms,
271
314
uniform_buf,
272
315
blas,
316
+ blas_with_one_too_much_triangles,
273
317
tlas_package,
274
318
pipeline,
275
319
bind_group,
@@ -311,6 +355,7 @@ impl crate::framework::Example for Example {
311
355
for x in 0 ..side_count {
312
356
for y in 0 ..side_count {
313
357
let instance = self . tlas_package . index_mut ( ( x + y * side_count) as usize ) ;
358
+ let checker = ( x ^ y) & 1 == 0 ;
314
359
315
360
let x = x as f32 / ( side_count - 1 ) as f32 ;
316
361
let y = y as f32 / ( side_count - 1 ) as f32 ;
@@ -334,7 +379,16 @@ impl crate::framework::Example for Example {
334
379
. try_into ( )
335
380
. unwrap ( ) ;
336
381
337
- * instance = Some ( wgpu:: TlasInstance :: new ( & self . blas , transform, 0 , 0xff ) ) ;
382
+ * instance = Some ( wgpu:: TlasInstance :: new (
383
+ if checker {
384
+ & self . blas
385
+ } else {
386
+ & self . blas_with_one_too_much_triangles
387
+ } ,
388
+ transform,
389
+ 0 ,
390
+ 0xff ,
391
+ ) ) ;
338
392
}
339
393
}
340
394
}
0 commit comments