@@ -642,21 +642,30 @@ void LightmapperRD::_create_acceleration_structures(RenderingDevice *rd, Size2i
642
642
}
643
643
644
644
{ // buffers
645
- vertex_buffer = rd->storage_buffer_create (vertex_array.size (), vertex_array.span ().reinterpret <uint8_t >());
645
+ vertex_buffer = rd->storage_buffer_create (vertex_array.size () * sizeof (Vertex) , vertex_array.span ().reinterpret <uint8_t >());
646
646
647
- triangle_buffer = rd->storage_buffer_create (triangles.size (), triangles.span ().reinterpret <uint8_t >());
647
+ triangle_buffer = rd->storage_buffer_create (triangles.size () * sizeof (Triangle) , triangles.span ().reinterpret <uint8_t >());
648
648
649
- r_triangle_indices_buffer = rd->storage_buffer_create (triangle_indices.size (), triangle_indices.span ().reinterpret <uint8_t >());
649
+ r_triangle_indices_buffer = rd->storage_buffer_create (triangle_indices.size () * sizeof ( uint32_t ) , triangle_indices.span ().reinterpret <uint8_t >());
650
650
651
- r_cluster_indices_buffer = rd->storage_buffer_create (cluster_indices.size (), cluster_indices.span ().reinterpret <uint8_t >());
651
+ r_cluster_indices_buffer = rd->storage_buffer_create (cluster_indices.size () * sizeof ( uint32_t ) , cluster_indices.span ().reinterpret <uint8_t >());
652
652
653
- r_cluster_aabbs_buffer = rd->storage_buffer_create (cluster_aabbs.size (), cluster_aabbs.span ().reinterpret <uint8_t >());
653
+ r_cluster_aabbs_buffer = rd->storage_buffer_create (cluster_aabbs.size () * sizeof (ClusterAABB) , cluster_aabbs.span ().reinterpret <uint8_t >());
654
654
655
- lights_buffer = rd->storage_buffer_create (lights.size () * sizeof (Light), lights.span ().reinterpret <uint8_t >());
655
+ // Even when there are no lights, the buffer must exist.
656
+ static const Light empty_lights[1 ];
657
+ Span<uint8_t > lb = (lights.is_empty () ? Span (empty_lights) : lights.span ()).reinterpret <uint8_t >();
658
+ lights_buffer = rd->storage_buffer_create (lb.size (), lb);
656
659
657
- seams_buffer = rd->storage_buffer_create (seam_buffer_vec.size () * sizeof (Vector2i) * 2 , seam_buffer_vec.span ().reinterpret <uint8_t >());
660
+ // Even when there are no seams, the buffer must exist.
661
+ static const Vector2i empty_seams[2 ];
662
+ Span<uint8_t > sb = (seam_buffer_vec.is_empty () ? Span (empty_seams) : seam_buffer_vec.span ()).reinterpret <uint8_t >();
663
+ seams_buffer = rd->storage_buffer_create (sb.size (), sb);
658
664
659
- probe_positions_buffer = rd->storage_buffer_create (p_probe_positions.size () * sizeof (Probe), p_probe_positions.span ().reinterpret <uint8_t >());
665
+ // Even when there are no probes, the buffer must exist.
666
+ static const Probe empty_probes[1 ];
667
+ Span<uint8_t > pb = (p_probe_positions.is_empty () ? Span (empty_probes) : p_probe_positions.span ()).reinterpret <uint8_t >();
668
+ probe_positions_buffer = rd->storage_buffer_create (pb.size (), pb);
660
669
}
661
670
662
671
{ // grid
0 commit comments