Skip to content

第二十五章 · 图像格式与子资源

25.1 图像格式

25.1.1 颜色格式

格式位深说明
R8_UNORM8单通道 8 位
RG8_UNORM16双通道 8 位
RGBA8_UNORM32标准 8 位 RGBA
RGBA8_SRGB32sRGB 空间 ✅
B8G8R8A8_UNORM32Vulkan 标准
RGBA32_SFLOAT128HDR RGBA
RGBA16_SFLOAT64HDR RGBA 半精度
BC1_RGB_SRGB_BLOCK8DXT1 压缩
BC3_RGBA_UNORM_BLOCK16DXT5 压缩
BC7_SRGB_BLOCK8BC7 高质量压缩
ETC2_R8G8B8A8_BLOCK16ETC2(移动)
ASTC_4x416ASTC(移动/桌面)

25.1.2 深度格式

格式深度模板
D32_SFLOAT32 bit
D24_UNORM_S8_UINT24 bit8 bit ✅
X8_D24_UNORM24 bit8 bit
D32_SFLOAT_S8_UINT32 bit8 bit

25.1.3 查询支持格式

python
# 查询设备支持的格式
for format in [
    vkbottle.Format.B8G8R8A8_SRGB,
    vkbottle.Format.R8G8B8A8_SRGB,
    vkbottle.Format.R32G32B32_SFLOAT,
]:
    props = device.get_physical_device().get_format_properties(format)
    print(f"{format}:")
    print(f"  linear: {props.linearTilingFeatures}")
    print(f"  optimal: {props.optimalTilingFeatures}")
    print(f"  buffer: {props.bufferFeatures}")

25.2 图像子资源

25.2.1 ImageSubresourceRange

python
# 指定图像的哪一部分
subresource_range = vkbottle.ImageSubresourceRange(
    aspectMask=vkbottle.ImageAspectFlag.COLOR_BIT,  # 颜色/深度/模板
    baseMipLevel=0,                                   # 起始 Mipmap
    levelCount=4,                                     # Mipmap 数量
    baseArrayLayer=0,                                 # 起始层
    layerCount=1,                                     # 层数
)

25.2.2 访问方式

python
# 查询资源访问属性
image_props = device.get_physical_device().get_format_properties(format)

# 检查是否支持特定用途
supports_transfer_src = (image_props.optimalTilingFeatures & 
                         vkbottle.ImageFeatureFlag.TRANSFER_SRC)
supports_shader_read = (image_props.optimalTilingFeatures & 
                        vkbottle.ImageFeatureFlag.SAMPLED_IMAGE)
supports_render_target = (image_props.optimalTilingFeatures & 
                          vkbottle.ImageFeatureFlag.COLOR_ATTACHMENT)

25.3 图像布局转换

python
# 常用布局转换
def transition_layout(cmd_buffer, image, old_layout, new_layout):
    barrier = vkbottle.ImageMemoryBarrier(
        srcAccessMask=vkbottle.AccessFlag.NONE,
        dstAccessMask=vkbottle.AccessFlag.NONE,
        oldLayout=old_layout,
        newLayout=new_layout,
        srcQueueFamilyIndex=vkbottle.QFO_TRANSFER_QUEUE_FAMILY_IGNORED,
        dstQueueFamilyIndex=vkbottle.QFO_TRANSFER_QUEUE_FAMILY_IGNORED,
        image=image,
        subresourceRange=vkbottle.ImageSubresourceRange(
            aspectMask=vkbottle.ImageAspectFlag.COLOR_BIT,
            baseMipLevel=0,
            levelCount=1,
            baseArrayLayer=0,
            layerCount=1,
        ),
    )
    cmd_buffer.pipeline_barrier(
        srcStageMask=vkbottle.AccessFlag.NONE,
        dstStageMask=vkbottle.AccessFlag.NONE,
        dependencyFlags=vkbottle.SubpassDependencyFlag.NONE,
        memoryBarriers=[],
        bufferMemoryBarriers=[],
        imageMemoryBarriers=[barrier],
    )

# 常用布局
# UNDEFINED → TRANSFER_DST_OPTIMAL → SHADER_READ_ONLY_OPTIMAL
# COLOR_ATTACHMENT_OPTIMAL → PRESENT_SRC_KHR

25.4 格式速查

用途推荐格式
纹理显示B8G8R8A8_SRGB
HDR 纹理RGBA32_SFLOAT
深度缓冲D24_UNORM_S8_UINT
压缩纹理BC7_SRGB_BLOCK(桌面)/ ASTC(移动)
G-BufferRGBA16_SFLOAT
阴影贴图D32_SFLOAT