VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL与READ_ONLY_OPTIMAL的区别解惑
关于
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL与VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL的差异 核心差异可以直接划清:
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:仅支持着色器发起的只读访问,包括采样图像、组合图像/采样器、输入附件这三类着色器内的访问场景,且要求图像必须启用VK_IMAGE_USAGE_SAMPLED_BIT或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT使用位。VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL:支持的访问范围更广,除了覆盖上述所有着色器内的只读访问外,还允许非着色器阶段的只读附件访问——比如部分硬件平台上,可直接将该布局的图像作为只读深度/模板附件,由固定功能硬件单元直接读取,无需经过着色器。
你疑惑的“难道所有读取操作都来自着色器”,答案是否定的:Vulkan里存在固定功能硬件直接访问附件的场景,这类操作就不需要经过着色器。比如硬件执行深度测试时直接读取深度缓冲,这种访问就不属于着色器发起的,此时VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL无法满足需求,但VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL可以支持。
额外补充:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL是通过VK_KHR_portability_subset扩展引入的,主要目的是对齐其他图形API(比如OpenGL)的资源模型,提升跨平台兼容性;而VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL是核心Vulkan规范里的原生布局。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

