@@ -62,7 +62,14 @@ fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
6262 20 , 21 , 22 , 22 , 23 , 20 , // back
6363 ] ;
6464
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+ )
6673}
6774
6875#[ repr( C ) ]
@@ -98,6 +105,7 @@ struct Example {
98105 uniforms : Uniforms ,
99106 uniform_buf : wgpu:: Buffer ,
100107 blas : wgpu:: Blas ,
108+ blas_with_one_too_much_triangles : wgpu:: Blas ,
101109 tlas_package : wgpu:: TlasPackage ,
102110 pipeline : wgpu:: RenderPipeline ,
103111 bind_group : wgpu:: BindGroup ,
@@ -164,11 +172,11 @@ impl crate::framework::Example for Example {
164172 usage : wgpu:: BufferUsages :: INDEX | wgpu:: BufferUsages :: BLAS_INPUT ,
165173 } ) ;
166174
167- let blas_geo_size_desc = wgpu:: BlasTriangleGeometrySizeDescriptor {
175+ let mut blas_geo_size_desc = wgpu:: BlasTriangleGeometrySizeDescriptor {
168176 vertex_format : wgpu:: VertexFormat :: Float32x3 ,
169177 vertex_count : vertex_data. len ( ) as u32 ,
170178 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 ) ,
172180 flags : wgpu:: AccelerationStructureGeometryFlags :: OPAQUE ,
173181 } ;
174182
@@ -183,6 +191,25 @@ impl crate::framework::Example for Example {
183191 } ,
184192 ) ;
185193
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+
186213 let tlas = device. create_tlas ( & wgpu:: CreateTlasDescriptor {
187214 label : None ,
188215 flags : wgpu:: AccelerationStructureFlags :: PREFER_FAST_TRACE ,
@@ -243,22 +270,38 @@ impl crate::framework::Example for Example {
243270 device. create_command_encoder ( & wgpu:: CommandEncoderDescriptor { label : None } ) ;
244271
245272 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+ ] ,
262305 iter:: once ( & tlas_package) ,
263306 ) ;
264307
@@ -270,6 +313,7 @@ impl crate::framework::Example for Example {
270313 uniforms,
271314 uniform_buf,
272315 blas,
316+ blas_with_one_too_much_triangles,
273317 tlas_package,
274318 pipeline,
275319 bind_group,
@@ -311,6 +355,7 @@ impl crate::framework::Example for Example {
311355 for x in 0 ..side_count {
312356 for y in 0 ..side_count {
313357 let instance = self . tlas_package . index_mut ( ( x + y * side_count) as usize ) ;
358+ let checker = ( x ^ y) & 1 == 0 ;
314359
315360 let x = x as f32 / ( side_count - 1 ) as f32 ;
316361 let y = y as f32 / ( side_count - 1 ) as f32 ;
@@ -334,7 +379,16 @@ impl crate::framework::Example for Example {
334379 . try_into ( )
335380 . unwrap ( ) ;
336381
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+ ) ) ;
338392 }
339393 }
340394 }
0 commit comments