Vulkan Specification(Vulkan规范):第十一章 11.5. 图像视图

11.5. 图像视图

图像对象不会被管线着色器直接读写访问。作为替代,图像视图,表示图像资源连续的一部分,带有附加的元信息,可用作上述目的。 视图必须以与图像兼容的类型来被创建,必须表示图像资源的一个有效子集合。

图像视图通过VkImageView 类型的handle表示:

VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)

可以被创建的 图像视图的类型:

typedef enum VkImageViewType {
    VK_IMAGE_VIEW_TYPE_1D = 0,
    VK_IMAGE_VIEW_TYPE_2D = 1,
    VK_IMAGE_VIEW_TYPE_3D = 2,
    VK_IMAGE_VIEW_TYPE_CUBE = 3,
    VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,
    VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,
    VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,
} VkImageViewType;

图像视图的准确类型部分是隐式的,基于图像的类型、采样数量,和 下表 描述的视图创建参数。这个表格也展示了每一个图像视图类型在SPIR-V中对应的OpTypeImage Dim 和 Arrayed等参数。

可调用下面命令来创建图像视图:

VkResult vkCreateImageView(
    VkDevice                                    device,
    const VkImageViewCreateInfo*                pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkImageView*                                pView);
  • device 是创建图像视图的逻辑设备。

  • pCreateInfo 是一个指针,指向一个 VkImageViewCreateInfo 数据结构实例,它包含了创建图像视图所需的信息。

  • pAllocator 控制CPU端内存分配,如 内存分配 一章详述。

  • pView 指向一个 VkImageView handle,它是被返回的新生成的图像视图对象。

图像创建参数的一部分被视图所继承,剩余的参数被包含在pCreateInfo中。

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • pCreateInfo must be a pointer to a valid VkImageViewCreateInfo structure

  • If pAllocator is not NULLpAllocator must be a pointer to a valid VkAllocationCallbacks structure

  • pView must be a pointer to a VkImageView handle

Return Codes

Success

  • VK_SUCCESS

Failure

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkImageViewCreateInfo类型定义如下:

typedef struct VkImageViewCreateInfo {
    VkStructureType            sType;
    const void*                pNext;
    VkImageViewCreateFlags     flags;
    VkImage                    image;
    VkImageViewType            viewType;
    VkFormat                   format;
    VkComponentMapping         components;
    VkImageSubresourceRange    subresourceRange;
} VkImageViewCreateInfo;
  • sType 是这个数据结构的类型。

  • pNext 是`NULL` 或者一个指向拓展特定的数据结构的指针。

  • flags 被保留使用。

  • image is a VkImage on which the view will be created.

  • viewType 是图像视图的类型。

  • format 是一个 VkFormat 类型数据,描述了用于结束图像中数据元素的格式和类型。

  • components 指定了颜色成员(或深度成员,或转换到颜色成员之后的 stencil 成员)重映射。 参考 VkComponentMapping

  • subresourceRange 是一个 VkImageSubresourceRange,选择来view可访问的mipmap levels和array layers。

若以VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 创建 imageformat可以与该图像的格式不同, 但是若它们不等同, 那么它们必须是兼容的。 图像格式兼容性在 Format Compatibility Classes 小节中定义。

Table 8. Image and image view parameter compatibility requirements
Dim, Arrayed, MSImage parametersView parameters
 

imageType = ci.imageType
width = ci.extent.width
height = ci.extent.height
depth = ci.extent.depth
arrayLayers = ci.arrayLayers
samples = ci.samples
where ci is the VkImageCreateInfo used创建 image.

baseArrayLayer and layerCount are members of thesubresourceRange member.

1D, 0, 0

imageType = VK_IMAGE_TYPE_1D
width ≥ 1
height = 1
depth = 1
arrayLayers ≥ 1
samples = 1

viewType = VK_VIEW_TYPE_1D
baseArrayLayer ≥ 0
layerCount = 1

1D, 1, 0

imageType = VK_IMAGE_TYPE_1D
width ≥ 1
height = 1
depth = 1
arrayLayers ≥ 1
samples = 1

viewType = VK_VIEW_TYPE_1D_ARRAY
baseArrayLayer ≥ 0
layerCount ≥ 1

2D, 0, 0

imageType = VK_IMAGE_TYPE_2D
width ≥ 1
height ≥ 1
depth = 1
arrayLayers ≥ 1
samples = 1

viewType = VK_VIEW_TYPE_2D
baseArrayLayer ≥ 0
layerCount = 1

2D, 1, 0

imageType = VK_IMAGE_TYPE_2D
width ≥ 1
height ≥ 1
depth = 1
arrayLayers ≥ 1
samples = 1

viewType = VK_VIEW_TYPE_2D_ARRAY
baseArrayLayer ≥ 0
layerCount ≥ 1

2D, 0, 1

imageType = VK_IMAGE_TYPE_2D
width ≥ 1
height ≥ 1
depth = 1
arrayLayers ≥ 1
samples > 1

viewType = VK_VIEW_TYPE_2D
baseArrayLayer ≥ 0
layerCount = 1

2D, 1, 1

imageType = VK_IMAGE_TYPE_2D
width ≥ 1
height ≥ 1
depth = 1
arrayLayers ≥ 1
samples > 1

viewType = VK_VIEW_TYPE_2D_ARRAY
baseArrayLayer ≥ 0
layerCount ≥ 1

CUBE, 0, 0

imageType = VK_IMAGE_TYPE_2D
width ≥ 1
height = width
depth = 1
arrayLayers ≥ 6
samples = 1
flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT

viewType = VK_VIEW_TYPE_CUBE
baseArrayLayer ≥ 0
layerCount = 6

CUBE, 1, 0

imageType = VK_IMAGE_TYPE_2D
width ≥ 1
height = width
depth = 1
N ≥ 1
arrayLayers ≥ 6 × N
samples = 1
flags 包含 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT

viewType = VK_VIEW_TYPE_CUBE_ARRAY
baseArrayLayer ≥ 0
layerCount = 6 × NN ≥ 1

3D, 0, 0

imageType = VK_IMAGE_TYPE_3D
width ≥ 1
height ≥ 1
depth ≥ 1
arrayLayers = 1
samples = 1

viewType = VK_VIEW_TYPE_3D
baseArrayLayer = 0
layerCount = 1

Valid Usage

  • 若创建image时没有带有 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,那么 viewType 不能是VK_IMAGE_VIEW_TYPE_CUBE或 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY

  • 若 image cubemap arrays 特征没有被启用,viewType 不能是 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY

  • 若 ETC2 texture compression特征没有被启用, format 不能是 VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCKVK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCKVK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCKVK_FORMAT_EAC_R11_UNORM_BLOCK,VK_FORMAT_EAC_R11_SNORM_BLOCKVK_FORMAT_EAC_R11G11_UNORM_BLOCK,或VK_FORMAT_EAC_R11G11_SNORM_BLOCK

  • ASTC LDR texture compression特征没有被启用, format 不能是 VK_FORMAT_ASTC_4x4_UNORM_BLOCK,VK_FORMAT_ASTC_4x4_SRGB_BLOCKVK_FORMAT_ASTC_5x4_UNORM_BLOCKVK_FORMAT_ASTC_5x4_SRGB_BLOCK,VK_FORMAT_ASTC_5x5_UNORM_BLOCKVK_FORMAT_ASTC_5x5_SRGB_BLOCKVK_FORMAT_ASTC_6x5_UNORM_BLOCK,VK_FORMAT_ASTC_6x5_SRGB_BLOCKVK_FORMAT_ASTC_6x6_UNORM_BLOCKVK_FORMAT_ASTC_6x6_SRGB_BLOCK,VK_FORMAT_ASTC_8x5_UNORM_BLOCKVK_FORMAT_ASTC_8x5_SRGB_BLOCKVK_FORMAT_ASTC_8x6_UNORM_BLOCK,VK_FORMAT_ASTC_8x6_SRGB_BLOCKVK_FORMAT_ASTC_8x8_UNORM_BLOCKVK_FORMAT_ASTC_8x8_SRGB_BLOCK,VK_FORMAT_ASTC_10x5_UNORM_BLOCKVK_FORMAT_ASTC_10x5_SRGB_BLOCK,VK_FORMAT_ASTC_10x6_UNORM_BLOCKVK_FORMAT_ASTC_10x6_SRGB_BLOCK,VK_FORMAT_ASTC_10x8_UNORM_BLOCKVK_FORMAT_ASTC_10x8_SRGB_BLOCK,VK_FORMAT_ASTC_10x10_UNORM_BLOCKVK_FORMAT_ASTC_10x10_SRGB_BLOCK,VK_FORMAT_ASTC_12x10_UNORM_BLOCKVK_FORMAT_ASTC_12x10_SRGB_BLOCK,VK_FORMAT_ASTC_12x12_UNORM_BLOCK,或 VK_FORMAT_ASTC_12x12_SRGB_BLOCK

  • 若 BC texture compression 特征没有被启用, format 不能是 VK_FORMAT_BC1_RGB_UNORM_BLOCKVK_FORMAT_BC1_RGB_SRGB_BLOCKVK_FORMAT_BC1_RGBA_UNORM_BLOCKVK_FORMAT_BC1_RGBA_SRGB_BLOCKVK_FORMAT_BC2_UNORM_BLOCKVK_FORMAT_BC2_SRGB_BLOCKVK_FORMAT_BC3_UNORM_BLOCK,VK_FORMAT_BC3_SRGB_BLOCKVK_FORMAT_BC4_UNORM_BLOCKVK_FORMAT_BC4_SNORM_BLOCKVK_FORMAT_BC5_UNORM_BLOCKVK_FORMAT_BC5_SNORM_BLOCKVK_FORMAT_BC6H_UFLOAT_BLOCK,VK_FORMAT_BC6H_SFLOAT_BLOCKVK_FORMAT_BC7_UNORM_BLOCK,或 VK_FORMAT_BC7_SRGB_BLOCK

  • 若创建image 时带有 VK_IMAGE_TILING_LINEAR, format 必须是 一种格式,至少有一个受支持的bit 是 通过以相同值的format调用vkGetPhysicalDeviceFormatProperties 返回的VkFormatProperties::linearTilingFeatures其中的一个bit值。

  • 创建image时 必须让 usage value包含 至少 VK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_STORAGE_BIT,VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 其中的一个

  • 若创建image时带有 VK_IMAGE_TILING_LINEAR 且 usage包含 VK_IMAGE_USAGE_SAMPLED_BITformat 必须 被采样图像支持, 通过以相同值的format调用vkGetPhysicalDeviceFormatProperties 返回的VkFormatProperties::linearTilingFeatures 的VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT 指定的值。

  • 若创建image 时带有VK_IMAGE_TILING_LINEAR 且 usage包含 VK_IMAGE_USAGE_STORAGE_BITformat 必须 被存储图像所支持,如 VkFormatProperties::linearTilingFeaturesVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT 标识位所指定, 该数据结构通过以相同的 format参数调用vkGetPhysicalDeviceFormatProperties 返回,

  • 若创建image时 带有 VK_IMAGE_TILING_LINEAR,且 usage包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,format 必须被颜色附件所支持, 如 VkFormatProperties::linearTilingFeatures中的 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT 标识位所指定, 该数据结构通过调用 vkGetPhysicalDeviceFormatProperties 返回,得到相同的 format

  • 若创建image 时带有VK_IMAGE_TILING_LINEAR 且 usage包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITformat 必须 被depth/stencil附件所支持,如VkFormatProperties::linearTilingFeatures中的 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT 标识位所指定, 该数据结构通过以相同的 format参数调用 vkGetPhysicalDeviceFormatProperties返回

  • 若创建image 时带有VK_IMAGE_TILING_OPTIMALformat 中至少有一个bit位,出现在 通过以相同的 format参数调用vkGetPhysicalDeviceFormatProperties 返回的 VkFormatProperties::optimalTilingFeatures的值当中,

  • 若创建 image 时带有 VK_IMAGE_TILING_OPTIMAL,且 usage包含 VK_IMAGE_USAGE_SAMPLED_BITformat 必须 被采样图像所支持,如 VkFormatProperties::optimalTilingFeatures中的 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT 标识位所指定, 该数据结构通过以相同的 format参数调用 vkGetPhysicalDeviceFormatProperties返回

  • 若创建image 时带有VK_IMAGE_TILING_OPTIMAL 且 usage包含 VK_IMAGE_USAGE_STORAGE_BITformat 必须 被存储图像所支持,如 VkFormatProperties::optimalTilingFeaturesVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT标识位所指定, 该数据结构通过以相同的 format参数调用 vkGetPhysicalDeviceFormatProperties 返回

  • 若创建image 时带有VK_IMAGE_TILING_OPTIMAL 且 usage包含 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,format 必须被颜色附件所支持,如 VkFormatProperties::optimalTilingFeatures中的VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT 标识位所指定, 该数据结构通过以相同的 format参数调用 vkGetPhysicalDeviceFormatProperties 返回

  • 若创建image 时带有 VK_IMAGE_TILING_OPTIMAL 且 usage包含 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITformat 必须不为 depth/stencil 附件所支持,如VkFormatProperties::optimalTilingFeatures 中的  VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT标识位所指定, 该数据结构通过以相同的 format参数调用 vkGetPhysicalDeviceFormatProperties 返回

  • subresourceRange 必须时一个对image来说有效的图像子资源区间 (参考 图像视图)

  • 若创建image 时带有 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标识位, format 必须与 用来创建 image的 format相兼容, 如 Format Compatibility Classes

  • 若创建image 时没有带有 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标识位, format 必须与 创建 imageformat完全相同

  • image 是 非-稀疏的,那么它必须与单个VkDeviceMemory 对象完全并连续绑定。

  • subResourceRange 和 viewType 必须 与图像兼容,如 compatibility table所描述。

Valid Usage (Implicit)

  • sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO

  • pNext must be NULL

  • flags must be 0

  • image must be a valid VkImage handle

  • viewType must be a valid VkImageViewType value

  • format must be a valid VkFormat value

  • components must be a valid VkComponentMapping structure

  • subresourceRange must be a valid VkImageSubresourceRange structure

VkImageSubresourceRange类型数据结构定义如下:

typedef struct VkImageSubresourceRange {
    VkImageAspectFlags    aspectMask;
    uint32_t              baseMipLevel;
    uint32_t              levelCount;
    uint32_t              baseArrayLayer;
    uint32_t              layerCount;
} VkImageSubresourceRange;
  • aspectMask 是一个位掩码,表明该图像的哪个(些)aspect被视图所包含。参考 VkImageAspectFlagBits.

  • baseMipLevel 是视图可以访问的第一个mipmap层级。

  • levelCount 是视图可以访问的mipmap层级的数量(从baseMipLevel开始)。

  • baseArrayLayer 是视图可以访问的第一个array layer。

  • layerCount 是视图可以访问的array layers 的数量(从 baseArrayLayer开始)。

mipmap 层数和array layers的数量必须是图像中图像资源的子集。 如果一个应用程序想要使用在baseMipLevel 或 baseArrayLayer之后的所有的mipmap层或者图像的layer, 它可以设置levelCount 和 layerCount为特殊值 VK_REMAINING_MIP_LEVELS 和 VK_REMAINING_ARRAY_LAYERS,而不用知道mipmap层和layer的准确大小。

对于立方和cube array视图,图像视图的layer从baseArrayLayer开始,依序分别对应+X, -X, +Y, -Y, +Z, -Z 面。 对于立方体 arrays,六个连续层级的每一个都是单独的一个立方体,所以立方体map数组视图中的 立方体maps个数是 layerCount / 6, 且 图像数组层级 baseArrayLayer + i 是立方体 i / 6 的 i mod 6 个面的索引。 若不管layerCount中显式设置的值或者VK_REMAINING_ARRAY_LAYERS指定的值,视图中层级的数量不是6的倍数, 索引最后一个立方体的行为是未定义的。

aspectMask 是一个位掩码,表明了被使用的格式。bit位包括如下:

typedef enum VkImageAspectFlagBits {
    VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
    VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
    VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
    VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
} VkImageAspectFlagBits;

format 是一个颜色,depth-only或 stencil-only 格式,那么此掩码必须对应的是 VK_IMAGE_ASPECT_COLOR_BIT,VK_IMAGE_ASPECT_DEPTH_BIT或 VK_IMAGE_ASPECT_STENCIL_BIT。 若使用一个 depth/stencil 格式的 depth 和 stencil 成员,aspectMask 必须至少包含 VK_IMAGE_ASPECT_DEPTH_BIT 和 VK_IMAGE_ASPECT_STENCIL_BIT其中一个,或全都包含。

When using an imageView of a depth/stencil image to populate a descriptor set (e.g. for sampling in the shader,或 for use as an input attachment), the aspectMask 必须 only include one bit and selects whether the imageView is used for depth reads (i.e. using a floating-point sampler或 input attachment in the shader)或 stencil reads (i.e. using an unsigned integer sampler或 input attachment in the shader). When an imageView of a depth/stencil image is used as a depth/stencil framebuffer attachment, the aspectMask is ignored and both depth and stencil image subresources are used.

components 成员是VkComponentMapping类型的,且描述了 从该图像的成员 重映射到 着色器图像指令返回的数组的成员。

这个重映射必须对storage image descriptors, input attachment descriptors, 和 framebuffer attachments来说是完全一致的。

Valid Usage

  • levelCount is not VK_REMAINING_MIP_LEVELSlevelCount 必须 be non-zero and (baseMipLevel + levelCount) 必须 be小于或 等于 the mipLevels specified in VkImageCreateInfo when该图像 was created

  • layerCount is not VK_REMAINING_ARRAY_LAYERSlayerCount 必须 be non-zero and (baseArrayLayer + layerCount) 必须 be小于或 等于 the arrayLayers specified in VkImageCreateInfo when该图像 was created

Valid Usage (Implicit)

VkComponentMapping 类型数据结构定义如下:

typedef struct VkComponentMapping {
    VkComponentSwizzle    r;
    VkComponentSwizzle    g;
    VkComponentSwizzle    b;
    VkComponentSwizzle    a;
} VkComponentMapping;
  • r 决定了输出向量中R成员的值。

  • g 决定了输出向量中G成员的值。

  • b 决定了输出向量中B成员的值。

  • a 决定了输出向量中A成员的值。

rgb, and a 其一的值都是如下的一个:

typedef enum VkComponentSwizzle {
    VK_COMPONENT_SWIZZLE_IDENTITY = 0,
    VK_COMPONENT_SWIZZLE_ZERO = 1,
    VK_COMPONENT_SWIZZLE_ONE = 2,
    VK_COMPONENT_SWIZZLE_R = 3,
    VK_COMPONENT_SWIZZLE_G = 4,
    VK_COMPONENT_SWIZZLE_B = 5,
    VK_COMPONENT_SWIZZLE_A = 6,
} VkComponentSwizzle;
  • VK_COMPONENT_SWIZZLE_IDENTITY: 此成员被设置为各自的值。

  • VK_COMPONENT_SWIZZLE_ZERO: 此成员被设置为0。

  • VK_COMPONENT_SWIZZLE_ONE: t此成员被设置为 1或 1.0,取决于该图像视图格式的类型是整型还是浮点型,如 Format Definition 小节中每种 VkFormat所描述。

  • VK_COMPONENT_SWIZZLE_R: 此成员被设置到该图像的R成员。

  • VK_COMPONENT_SWIZZLE_G: 此成员被设置到该图像的G成员。

  • VK_COMPONENT_SWIZZLE_B: 此成员被设置到该图像的B成员。

  • VK_COMPONENT_SWIZZLE_A: 此成员被设置到该图像的A成员。

Setting the identity swizzle on a component is equivalent to setting the identity mapping on that component. That is:

Table 9. Component Mappings Equivalent To  VK_COMPONENT_SWIZZLE_IDENTITY
ComponentIdentity Mapping

components.r

VK_COMPONENT_SWIZZLE_R

components.g

VK_COMPONENT_SWIZZLE_G

components.b

VK_COMPONENT_SWIZZLE_B

components.a

VK_COMPONENT_SWIZZLE_A

Valid Usage (Implicit)

可调用下列命令来销毁图像视图:

void vkDestroyImageView(
    VkDevice                                    device,
    VkImageView                                 imageView,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁图像视图的逻辑设备。

  • imageView 是需要被销毁的图像视图。

  • pAllocator 控制CPU端内存分配,如 内存分配 一章详述。

Valid Usage

  • 所有指向imageView 的被提交的命令 必须已经完成执行。

  • 若当创建 imageView 时提供了 VkAllocationCallbacks,那么此处必须提供兼容的回调函数。

  • 若当创建  imageView时没有提供VkAllocationCallbacks ,那么此处 pAllocator 必须为 NULL

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • If imageView is not VK_NULL_HANDLEimageView must be a valid VkImageView handle

  • If pAllocator is not NULLpAllocator must be a pointer to a valid VkAllocationCallbacks structure

  • If imageView is a valid handle, it must have been created, allocated, or retrieved from device

Host Synchronization

  • Host access to imageView must be externally synchronized

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值