示例#1
0
 private void RecreateDescriptorSets()
 {
     Graphics.Device.WaitIdle();
     // Clean up
     foreach (var set in GraphicsDescriptorSets.Values)
     {
         set.Dispose();
     }
     GraphicsDescriptorSets.Clear();
     foreach (var set in ComputeDescriptorSets.Values)
     {
         set.Dispose();
     }
     ComputeDescriptorSets.Clear();
     // Create sets
     foreach (var keyList in InstanceLists)
     {
         var(texture, animation) = ((Texture2D, Animation))keyList.Key;
         var list = keyList.Value;
         // Graphics set
         var set = GraphicsDescriptorPool.AllocateSets(new DescriptorSetAllocateInfo(
                                                           1, GraphicsDescriptorSetLayout
                                                           ))[0];
         GraphicsDescriptorPool.UpdateSets(
             new WriteDescriptorSet[]
         {
             new WriteDescriptorSet(
                 set, 0, 0, 1, DescriptorType.UniformBuffer,
                 bufferInfo: new DescriptorBufferInfo[]
             {
                 new DescriptorBufferInfo(CameraUniform.Buffer)
             }
                 ),
             new WriteDescriptorSet(
                 set, 1, 0, 1, DescriptorType.CombinedImageSampler,
                 imageInfo: new DescriptorImageInfo[]
             {
                 new DescriptorImageInfo(
                     TextureSampler,
                     texture.Image.ImageView,
                     ImageLayout.ShaderReadOnlyOptimal
                     )
             }
                 ),
             new WriteDescriptorSet(
                 set, 2, 0, 1, DescriptorType.UniformBuffer,
                 bufferInfo: new DescriptorBufferInfo[]
             {
                 new DescriptorBufferInfo(TimeUniform.Buffer)
             }
                 )
         }
             );
         GraphicsDescriptorSets.Add(list, set);
         // Compute set
         set = ComputeDescriptorPool.AllocateSets(new DescriptorSetAllocateInfo(
                                                      1, ComputeDescriptorSetLayout
                                                      ))[0];
         ComputeDescriptorPool.UpdateSets(
             new WriteDescriptorSet[]
         {
             new WriteDescriptorSet(
                 set, 0, 0, 1, DescriptorType.StorageBuffer,
                 bufferInfo: new DescriptorBufferInfo[]
             {
                 new DescriptorBufferInfo(ComputeInstanceBuffers[list].Buffer)
             }
                 ),
             new WriteDescriptorSet(
                 set, 1, 0, 1, DescriptorType.StorageBuffer,
                 bufferInfo: new DescriptorBufferInfo[]
             {
                 new DescriptorBufferInfo(VertexInstanceBuffers[list].Buffer)
             }
                 ),
             new WriteDescriptorSet(
                 set, 2, 0, 1, DescriptorType.UniformBuffer,
                 bufferInfo: new DescriptorBufferInfo[]
             {
                 new DescriptorBufferInfo(TimeUniform.Buffer)
             }
                 ),
             new WriteDescriptorSet(
                 set, 3, 0, 1, DescriptorType.UniformBuffer,
                 bufferInfo: new DescriptorBufferInfo[]
             {
                 new DescriptorBufferInfo(AnimationUniform.Buffer)
             }
                 )
         }
             );
         ComputeDescriptorSets.Add(list, set);
     }
 }