同时使用 VkSamplers?

问题描述

所以一个 VkSampler 是用一个 VkSamplerCreateInfo 创建的,它只有一堆配置设置,据我所知,它只是定义了一些输入图像的纯函数

它们被描述为:

VkSampler 对象表示图像采样器的状态,实现使用它来 读取图像数据并为着色器应用过滤和其他转换。

VkSampler 的一个用途(可能只是用途)是将它们写入描述符(例如 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER),以便在绑定到管道/着色器的描述符集中使用。

我的问题是:你能把同一个 VkSampler 写到多个不同的描述符上吗?来自相同或多个不同的描述符池?即使当前描述符之一正在某些当前正在执行的渲染通道中使用?

是否可以同时使用来自多个不同渲染通道/子通道/管道的同一个 VkSampler?

换句话说,VkSampler 是无状态的吗?还是它们代表设备上的一些有状态内存,因此您不应同时使用相同的内存?

解决方法

VkSampler 对象肯定有与之关联的数据,因此称它们为“无状态”是错误的。它们是不可变的。像VkRenderPassVkPipeline等类似的对象,一旦创建,其内容就无法更改。

访问之间的同步(通常)仅在访问之一是修改操作的情况下才需要。由于 VkSampler 是不可变的,因此没有 修改操作。因此,对于从不同线程、命令或其他内容访问 VkSampler 的情况,不需要同步。

唯一的例外是明显的例外:vkDestroySampler,它要求使用采样器的提交命令在调用函数之前已经完成。