any() 和 all() 分别用来判断数组中是否有一个为 true 以及是否所有的元素都是 trueVkResult vkCreateShaderModule (
VkDevice device,
const VkShaderModuleCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkShaderModule* pShaderModule
);
VkShaderModuleCreateInfotypedef struct VkShaderModuleCreateInfo
{
//为 VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//为 0
VkShaderModuleCreateFlags flags;
//SPIR-V 模块的大小
size_t codeSize;
const uint32_t* pCode;
} VkShaderModuleCreateInfo;
void vkDestroyShaderModule (
VkDevice device,
VkShaderModule shaderModule,
const VkAllocationCallbacks* pAllocator
);
layout (local_size_x = 4, local_size_y = 5, local_size_z 6) in;
vkGetPhysicalDeviceProperties()
VkPhysicalDeviceLimits
maxComputeWorkGroupSize maxComputeWorkGroupInvocationsVkResult vkCreateComputePipelines (
VkDevice device,
//用来加速管线创建的一个对象的句柄
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
//个新管线的参数信息
const VkComputePipelineCreateInfo* pCreateInfos,
const VkAllocationCallbacks* pAllocator,
VkPipeline* pPipelines
);
VkComputePipelineCreateInfotypedef struct VkComputePipelineCreateInfo
{
//VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineCreateFlags flags;
//包含着色器本身的信息
VkPipelineShaderStageCreateInfo stage;
VkPipelineLayout layout;
VkPipeline basePipelineHandle;
int32_t basePipelineIndex;
} VkComputePipelineCreateInfo;
VkPipelineShaderStageCreateInfotypedef struct VkPipelineShaderStageCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineShaderStageCreateFlags flags;
//管线创建的阶段
//VK_SHADER_STAGE_COMPUTE_BIT
VkShaderStageFlagBits stage;
//着色器模块的句柄
VkShaderModule module;
//表示这个特别的管线的入口点
const char* pName;
//包含特化一个着色器所需的信息
const VkSpecializationInfo* pSpecializationInfo;
} VkPipelineShaderStageCreateInfo;
vkCreateComputePipelines() 函数typedef struct VkSpecializationInfo
{
//需要设置新值的特化常量的个数
uint32_t mapEntryCount;
//表示特化常量
const VkSpecializationMapEntry* pMapEntries;
//数据大小
size_t dataSize;
//原生数据
const void* pData;
} VkSpecializationInfo;
VkSpecializationMapEntrytypedef struct VkSpecializationMapEntry
{
//特化常量的 ID, 使用 constant_id 布局限定符来设置值
uint32_t constantID;
//原生数据偏移量
uint32_t offset;
原生数据大小
size_t size;
} VkSpecializationMapEntry;
void vkDestroyPipeline (
VkDevice device,
VkPipeline pipeline,
const VkAllocationCallbacks* pAllocator
);
VkResult vkCreatePipelineCache (
VkDevice device,
const VkPipelineCacheCreateInfo* pCreateInfo,
const VkAllocationCallbacks * pAllocator,
VkPipelineCache* pPipelineCache
);
VkPipelineCacheCreateInfotypedef struct VkPipelineCacheCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO
VkStructureType sType;
//nullptr
const void * pNext;
//0
VkPipelineCacheCreateFlags flags;
size_t initialDataSize;
//存在程序上一次运行产生的数据的地址
const void * pInitialData;
} VkPipelineCacheCreateInfo;
VkResult vkGetPipelineCacheData (
VkDevice device,
VkPipelineCache pipelineCache,
//内存区域的大小
size_t* pDataSize,
//缓存数据的内存区域
void* pData
);
vkGetPipelineCacheData() 两次来存储所有的缓存数据VkResult vkMergePipelineCaches (
VkDevice device,
//目标缓存的句柄
VkPipelineCache dstCache,
//待融合缓存的个数
uint32_t srcCacheCount,
const VkPipelineCache* pSrcCaches
);
void vkDestroyPipelineCache (
VkDevice device,
VkPipelineCache pipelineCache,
const VkAllocationCallbacks* pAllocator
);
void vkCmdBindPipeline (
VkCommandBuffer commandBuffer,
VkPipelineBindPoint pipelineBindPoint,
VkPipeline pipeline
);
void vkCmdDispatch (
VkCommandBuffer commandBuffer,
uint32_t x,
uint32_t y,
uint32_t z
);
void vkCmdDispatchIndirect (
VkCommandBuffer commandBuffer,
//工作组存储在 3 个连续的 uint32_t 类型的变量
VkBuffer buffer,
//偏移量
VkDeviceSize offset
);
typedef struct VkDispatchIndirectCommand
{
uint32_t x;
uint32_t y;
uint32_t z;
} VkDispatchIndirectCommand;
VkResult vkCreateDescriptorSetLayout (
VkDevice device,
const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDescriptorSetLayout* pSetLayout
);
VkDescriptorSetLayoutCreateInfotypedef struct VkDescriptorSetLayoutCreateInfo
{
//VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkDescriptorSetLayoutCreateFlags flags;
uint32_t bindingCount;
//把资源绑定到描述符集里的绑定点
const VkDescriptorSetLayoutBinding* pBindings;
} VkDescriptorSetLayoutCreateInfo;
VkDescriptorSetLayoutBindingtypedef struct VkDescriptorSetLayoutBinding
{
//每个着色器可访问的资源都具有一个绑定序号
//
uint32_t binding;
//绑定点的描述符的类型
VkDescriptorType descriptorType;
uint32_t descriptorCount;
VkShaderStageFlags stageFlags;
const VkSampler* pImmutableSamplers;
} VkDescriptorSetLayoutBinding;
VkDescriptorType
VkResult vkCreatePipelineLayout (
VkDevice device,
const VkPipelineLayoutCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkPipelineLayout* pPipelineLayout
);
VkPipelineLayoutCreateInfotypedef struct VkPipelineLayoutCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_ LAYOUT_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineLayoutCreateFlags flags;
//描述符集布局的数量
uint32_t setLayoutCount;
const VkDescriptorSetLayout* pSetLayouts;
//推送常量
uint32_t pushConstantRangeCount;
//推送常量
const VkPushConstantRange* pPushConstantRanges;
} VkPipelineLayoutCreateInfo;
vkGetPhysicalDeviceProperties()
VkPhysicalDeviceLimits
maxBoundDescriptorSetsvoid vkDestroyPipelineLayout (
VkDevice device,
VkPipelineLayout pipelineLayout,
const VkAllocationCallbacks* pAllocator
);
void vkDestroyDescriptorSetLayout (
VkDevice device,
VkDescriptorSetLayout descriptorSetLayout,
const VkAllocationCallbacks* pAllocator
);
VkResult vkCreateDescriptorPool (
VkDevice device,
const VkDescriptorPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDescriptorPool* pDescriptorPool
);
VkDescriptorPoolCreateInfotypedef struct VkDescriptorPoolCreateInfo
{
//VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//唯一定义VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
//应用程序可以释放从池中获取的单个描述符
//如果不打算把单个描述符归还给缓存池,把 flags 设置为 0 即可
VkDescriptorPoolCreateFlags flags;
//可从池中分配的集合数量的最大值
uint32_t maxSets;
//可以存储在集合中的每种类型资源可用的描述符个数
uint32_t poolSizeCount;
const VkDescriptorPoolSize* pPoolSizes;
} VkDescriptorPoolCreateInfo;
VkDescriptorPoolSizetypedef struct VkDescriptorPoolSize
{
//资源的类型
VkDescriptorType type;
//池中该种类型资源的个数
uint32_t descriptorCount;
} VkDescriptorPoolSize;
VkResult vkAllocateDescriptorSets (
VkDevice device,
const VkDescriptorSetAllocateInfo* pAllocateInfo,
VkDescriptorSet* pDescriptorSets
);
VkDescriptorSetAllocateInfotypedef struct VkDescriptorSetAllocateInfo
{
//VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//可以从中分配集合的描述符缓存池的句柄
//在外部保持同步
VkDescriptorPool descriptorPool;
//创建的集合的个数
uint32_t descriptorSetCount;
//每一个集合的布局
const VkDescriptorSetLayout* pSetLayouts;
} VkDescriptorSetAllocateInfo;
VkResult vkFreeDescriptorSets (
VkDevice device,
VkDescriptorPool descriptorPool,
uint32_t descriptorSetCount,
const VkDescriptorSet* pDescriptorSets
);
VkResult vkResetDescriptorPool (
VkDevice device,
VkDescriptorPool descriptorPool,
//为 0
VkDescriptorPoolResetFlags flags
);
void vkDestroyDescriptorPool(
VkDevice device,
VkDescriptorPool descriptorPool,
const VkAllocationCallbacks* pAllocator
);
void vkUpdateDescriptorSets (
VkDevice device,
uint32_t descriptorWriteCount,
const VkWriteDescriptorSet* pDescriptorWrites,
//描述符复制的次数
uint32_t descriptorCopyCount,
const VkCopyDescriptorSet* pDescriptorCopies
);
VkWriteDescriptorSettypedef struct VkWriteDescriptorSet
{
//VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
VkStructureType sType;
//nullptr
const void* pNext;
//目标描述符集
VkDescriptorSet dstSet;
//绑定索引
uint32_t dstBinding;
//绑定资源类型的数组,更新起始的索引
uint32_t dstArrayElement;
//需要更新的连续描述符个数
uint32_t descriptorCount;
//更新的资源的类型
VkDescriptorType descriptorType;
//图像资源
const VkDescriptorImageInfo* pImageInfo;
//缓冲区资源
const VkDescriptorBufferInfo* pBufferInfo;
const VkBufferView* pTexelBufferView;
} VkWriteDescriptorSet;
VkDescriptorImageInfotypedef struct VkDescriptorImageInfo
{
VkSampler sampler;
//视图
VkImageView imageView;
//所期望的布局
VkImageLayout imageLayout;
} VkDescriptorImageInfo;
VkDescriptorBufferInfotypedef struct VkDescriptorBufferInfo
{
VkBuffer buffer;
VkDeviceSize offset;
//如果是 uniform, 需要小于或者等于 maxUniformBufferRange
VkDeviceSize range;
} VkDescriptorBufferInfo;
maxUniformBufferRange 和 maxStorageBufferRange 上限分别保证至少是 16384 与
2
27
2^{27}
227minUniformBufferOffsetAlignment 和 minStorageBufferOffsetAlignment 要保证最多是 256 字节VkCopyDescriptorSettypedef struct VkCopyDescriptorSet {
//VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET
VkStructureType sType;
//nullptr
const void* pNext;
//源的描述符集的句柄
VkDescriptorSet srcSet;
//绑定索引
uint32_t srcBinding;
//描述符数组
uint32_t srcArrayElement;
//源的描述符集的句柄
VkDescriptorSet dstSet;
//绑定索引
uint32_t dstBinding;
//描述符数组
uint32_t dstArrayElement;
uint32_t descriptorCount;
} VkCopyDescriptorSet;
void vkCmdBindDescriptorSets (
VkCommandBuffer commandBuffer,
//VK_PIPELINE_BIND_POINT_COMPUTE
//or
//VK_PIPELINE_BIND_POINT_GRAPHICS
VkPipelineBindPoint pipelineBindPoint,
//使用的管线布局
VkPipelineLayout layout,
//管线布局可访问的集合的一个子集
uint32_t firstSet,
uint32_t descriptorSetCount,
const VkDescriptorSet* pDescriptorSets,
//动态 uniform 或着色器存储绑定的偏移量
//动态偏移量的个数
uint32_t dynamicOffsetCount,
//类型为 32 位偏移量的数组
const uint32_t* pDynamicOffsets
);
layout (set = 0, binding = 1) uniform my_uniform_buffer_t
{
float foo;
vec4 bar;
int baz[42];
} my_uniform_buffer;
layout (set = 0, binding = 2) buffer my_storage_buffer_t
{
int peas;
float carrots;
vec3 potatoes[99];
} my_storage_buffer;
layout (set = 0, binding = 3) uniform samplerBuffer my_float_texel_buffer;
layout (set = 0, binding = 4) uniform isamplerBuffer my_signed_texel_buffer;
layout (set = 0, binding = 5) uniform usamplerBuffer my_unsigned_texel_buffer;
VkPipelineLayoutCreateInfo
VkPushConstantRangetypedef struct VkPushConstantRange
{
//能看到常量的管线阶段
VkShaderStageFlags stageFlags;
uint32_t offset;
uint32_t size;
} VkPushConstantRange;
layout (push_constant) uniform my_push_constants_t
{
int bourbon;
int scotch;
int beer;
} my_push_constants;
void vkCmdPushConstants (
VkCommandBuffer commandBuffer,
VkPipelineLayout layout,
//不更新没有包含的阶段来提升性能
VkShaderStageFlags stageFlags,
//第一个常量在虚拟块内的偏移量
uint32_t offset,
//更新的量的大小
uint32_t size,
//数据
const void* pValues
);
VkResult vkCreateSampler (
VkDevice device,
const VkSamplerCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSampler* pSampler
);
VkSamplerCreateInfotypedef struct VkSamplerCreateInfo
{
//VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkSamplerCreateFlags flags;
//过滤模式
//VK_FILTER_NEAREST
//VK_FILTER_LINEAR
VkFilter magFilter;
VkFilter minFilter;
//多重细节层
//VK_SAMPLER_MIPMAP_MODE_NEAREST
//VK_SAMPLER_MIPMAP_MODE_LINEAR
VkSamplerMipmapMode mipmapMode;
//纹理坐标的变换方式
//VK_SAMPLER_ADDRESS_MODE_REPEAT
//VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT
//VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
//VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
//VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
VkSamplerAddressMode addressModeU;
VkSamplerAddressMode addressModeV;
VkSamplerAddressMode addressModeW;
//浮点型偏移量, 作用于 mipmap
float mipLodBias;
//各向异性过滤
//各向异性过滤通常在投影范围内做采样,而不是在固定的 2×2 范围内
VkBool32 anisotropyEnable;
//范围是 1.0 到设备允许的最大值
//maxSamplerAnisotropy
float maxAnisotropy;
//比较模式
VkBool32 compareEnable;
//ALWAYS
//NEVER
//LESS
//LESS_OR_EQUAL
//EQUAL
//NOT_EQUAL
//GREATER
//GREATER_OR_EQUAL
//Page 179
VkCompareOp compareOp;
//在带有 mipmap 的图像中,采样器可配置成只在一个层级子集中采样
//被限制的 mipmap 范围通过 minLod 和 maxLod 指定
//要在整个 mipmap 链上做采样,设置 minLod 为 0.0,并设置 maxLod 为最高层
float minLod;
float maxLod;
//
VkBorderColor borderColor;
//当设置为 VK_TRUE 时,表示图像用于采样的坐标以原生纹素为单位,而不是 uv
//使用限制
//minFilter 和 magFilter 必须是相同的
//mipmapMode 必须是 VK_SAMPLER_MIPMAP_MODE_NEAREST
//anisotropyEnable 和 compareEnable 必须是 VK_FALSE
VkBool32 unnormalizedCoordinates;
} VkSamplerCreateInfo;
VkPhysicalDeviceLimits
maxSamplerAllocationCountvoid vkDestroySampler (
VkDevice device,
VkSampler sampler,
const VkAllocationCallbacks* pAllocator
);
void vkCmdDraw (
VkCommandBuffer commandBuffer,
//附加到管线的顶点的数量
uint32_t vertexCount,
//1, 或实例绘制物体
uint32_t instanceCount,
//可以从非零个顶点或者实例开始绘制
uint32_t firstVertex,
uint32_t firstInstance
);
VkResult vkCreateRenderPass (
VkDevice device,
const VkRenderPassCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkRenderPass* pRenderPass
);
VkRenderPassCreateInfotypedef struct VkRenderPassCreateInfo
{
//VK_STRUCTURE_TYPE_RENDERPASS_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkRenderPassCreateFlags flags;
uint32_t attachmentCount;
//组定义和渲染通道关联的多个附件
const VkAttachmentDescription* pAttachments;
uint32_t subpassCount;
const VkSubpassDescription* pSubpasses;
uint32_t dependencyCount;
//依赖信息
//当在一个渲染通道中有多个子通道时
//Vulkan 可推算出一个附件依赖了哪些附件
//这需要通过跟踪附件引用,并查找输入和输出完成
//当无法自动跟踪时,使用该字段定义依赖信息
const VkSubpassDependency* pDependencies;
} VkRenderPassCreateInfo;
VkAttachmentDescriptiontypedef struct VkAttachmentDescription
{
//VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 附件可能和同一个渲染通道引用的其他附件使用相同的内存
//这告诉 Vulkan 不要做任何可能导致附件的数据不一致的事情
//一般情况为 0
VkAttachmentDescriptionFlags flags;
VkFormat format;
//图像中采样的次数
//不使用多次采用:VK_SAMPLE_COUNT_1_BIT。
VkSampleCountFlagBits samples;
//下面 4 个指定了在渲染通道的开始与结束时如何处理附件
//VK_ATTACHMENT_LOAD_OP_LOAD 表示附件里已经有数据了,仍想继续对它进行渲染
//VK_ATTACHMENT_LOAD_OP_CLEAR 在渲染通道开始时清除附件的内容
//VK_ATTACHMENT_LOAD_OP_DONT_CARE 渲染通道开始时不关心附件的内容
VkAttachmentLoadOp loadOp;
//VK_ATTACHMENT_STORE_OP_STORE 让 Vulkan 保留附件的内容以供稍后使用
//VK_ATTACHMENT_STORE_OP_DONT_CARE 在渲染通道结束后不需要附件的内容
VkAttachmentStoreOp storeOp;
VkAttachmentLoadOp stencilLoadOp;
VkAttachmentStoreOp stencilStoreOp;
//渲染通道开始期望图像是什么布局
VkImageLayout initialLayout;
//在渲染通道结束时期望图像是什么布局
VkImageLayout finalLayout;
} VkAttachmentDescription;
typedef struct VkSubpassDescription
{
//0
VkSubpassDescriptionFlags flags;
//现阶段为 VK_PIPELINE_BIND_POINT_GRAPHICS
VkPipelineBindPoint pipelineBindPoint;
//个、输入附件,可以从中读出数据
uint32_t inputAttachmentCount;
const VkAttachmentReference* pInputAttachments;
uint32_t colorAttachmentCount;
//颜色附件是写入输出数据的附件
const VkAttachmentReference* pColorAttachments;
//解析附件是对多重采样图像数据进行解析后存储的附件
const VkAttachmentReference* pResolveAttachments;
const VkAttachmentReference* pDepthStencilAttachment;
uint32_t preserveAttachmentCount;
//如果希望附件的生存周期跨越一个子通道但并不被子通道直接引用
//该引用将阻止 Vulkan 进行任何可能改动这些附件内容的优化
const uint32_t* pPreserveAttachments;
} VkSubpassDescription;
VkAttachmentReferencetypedef struct VkAttachmentReference
{
//附件数组的索引
uint32_t attachment;
//图像布局
VkImageLayout layout;
} VkAttachmentReference;
maxColorAttachmentsVkSubpassDependencytypedef struct VkSubpassDependency
{
//源子通道
uint32_t srcSubpass;
//目标子通道
uint32_t dstSubpass;
//指定了源子通道的哪些管线阶段产生数据
VkPipelineStageFlags srcStageMask;
//指定了目标子通道的哪些管线阶段使用数据
VkPipelineStageFlags dstStageMask;
//如何访问数据
VkAccessFlags srcAccessMask;
VkAccessFlags dstAccessMask;
VkDependencyFlags dependencyFlags;
} VkSubpassDependency;
void vkDestroyRenderPass (
VkDevice device,
VkRenderPass renderPass,
const VkAllocationCallbacks* pAllocator
);
VkResult vkCreateFramebuffer (
VkDevice device,
const VkFramebufferCreateInfo* pCreateInfo,
//如果要求使用主机内存,就将会用到 pAllocator 所指向的分配器
const VkAllocationCallbacks* pAllocator,
VkFramebuffer* pFramebuffer
);
VkFramebufferCreateInfotypedef struct VkFramebufferCreateInfo
{
//VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkFramebufferCreateFlags flags;
VkRenderPass renderPass;
//数组的长度
uint32_t attachmentCount;
const VkImageView* pAttachments;
//必须指定帧缓冲区的维度
uint32_t width;
uint32_t height;
uint32_t layers;
} VkFramebufferCreateInfo;
VkPhysicalDeviceLimits
maxFramebufferWidthmaxFramebufferHeightmaxFramebufferLayersvoid vkDestroyFramebuffer (
VkDevice device,
VkFramebuffer framebuffer,
const VkAllocationCallbacks* pAllocator
);
VkResult vkCreateGraphicsPipelines (
VkDevice device,
//管线缓存
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
const VkGraphicsPipelineCreateInfo* pCreateInfos,
const VkAllocationCallbacks* pAllocator,
VkPipeline* pPipelines
);
VkGraphicsPipelineCreateInfotypedef struct VkGraphicsPipelineCreateInfo
{
//VK_GRAPHICS_PIPELINE_CREATE_INFO
VkStructureType sType;
//nullptr,可以使用扩展
const void* pNext;
//管线如何使用的信息
VkPipelineCreateFlags flags;
uint32_t stageCount;
//把着色器传递到管线的目标位置
//描述了一个着色阶段
const VkPipelineShaderStageCreateInfo* pStages;
//顶点输入状态
const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
//输入组装接受顶点数据
const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
//细分状态
const VkPipelineTessellationStateCreateInfo* pTessellationState;
//视口状态
const VkPipelineViewportStateCreateInfo* pViewportState;
//光栅化状态
const VkPipelineRasterizationStateCreateInfo* pRasterizationState;
//多重采样状态
const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
//深度和模板状态
const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
//颜色混合状态
const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
//动态状态
const VkPipelineDynamicStateCreateInfo* pDynamicState;
VkPipelineLayout layout;
VkRenderPass renderPass;
uint32_t subpass;
VkPipeline basePipelineHandle;
int32_t basePipelineIndex;
} VkGraphicsPipelineCreateInfo;
VkPipelineCreateFlags
VkPipelineShaderStageCreateInfotypedef struct VkPipelineShaderStageCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineShaderStageCreateFlags flags;
VkShaderStageFlagBits stage;
VkShaderModule module;
const char* pName;
const VkSpecializationInfo* pSpecializationInfo;
} VkPipelineShaderStageCreateInfo;
VertexInputStateCreateInfotypedef struct VkPipelineVertexInputStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineVertexInputStateCreateFlags flags;
//是管线使用的顶点绑定的个数
uint32_t vertexBindingDescriptionCount;
const VkVertexInputBindingDescription* pVertexBindingDescriptions;
uint32_t vertexAttributeDescriptionCount;
//顶点属性都
const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
} VkPipelineVertexInputStateCreateInfo;
VkVertexInputBindingDescriptiontypedef struct VkVertexInputBindingDescription
{
//结构体描述的绑定的索引
uint32_t binding;
//数组的步长
uint32_t stride;
//遍历数组的方式
//实例索引 VK_VERTEX_INPUT_RATE_VERTEX
//顶点索引 VK_VERTEX_INPUT_RATE_INSTANCE。
VkVertexInputRate inputRate;
} VkVertexInputBindingDescription;
VkVertexInputBindingDescription 数组声明的最后一个绑定索引必须比设备支持的最大绑定数要小
VkPhysicalDeviceLimits
maxVertexInputBindingsVkPhysicalDeviceLimits
maxVertexInputBindingStrideVkVertexInputAttributeDescriptiontypedef struct VkVertexInputAttributeDescription
{
//属性的位置
uint32_t location;
//绑定缓冲区的位置
uint32_t binding;
//顶点数据的格式
VkFormat format;
//每个数据的偏移量
uint32_t offset;
} VkVertexInputAttributeDescription;
VkPhysicalDeviceLimits
maxVertexInputVkPipelineInputAssemblyStateCreateInfotypedef struct VkPipelineInputAssemblyStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineInputAssemblyStateCreateFlags flags;
//图元拓扑类型
VkPrimitiveTopology topology;
//允许条带与扇形被切除和重启
VkBool32 primitiveRestartEnable;
} VkPipelineInputAssemblyStateCreateInfo;
VkPrimitiveTopology
VkPipelineTessellationStateCreateInfotypedef struct VkPipelineTessellationStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineTessellationStateCreateFlags flags;
//设置了将分组到一个图元的控制点的个数
uint32_t patchControlPoints;
} VkPipelineTessellationStateCreateInfo;
VkPipelineViewportStateCreateInfotypedef struct VkPipelineViewportStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineViewportStateCreateFlags flags;
//视口的个数
uint32_t viewportCount;
//每一个视口的尺寸
const VkViewport* pViewports;
uint32_t scissorCount;
//设置裁剪矩形
const VkRect2D* pScissors;
} VkPipelineViewportStateCreateInfo;
VkPhysicalDeviceLimits
maxViewportsVkPipelineRasterizationStateCreateInfotypedef struct VkPipelineRasterizationStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineRasterizationStateCreateFlags flags;
//开启或关闭深度夹持(哈哈)
//本该被远近平面裁剪掉的片段投射到这些平面上
//可用来填充因为裁剪造成的空洞
VkBool32 depthClampEnable;
//关闭光栅化,光栅器将不会运行,将不会产生图元
VkBool32 rasterizerDiscardEnable;
//自动地把三角形转化为点或者直线
VkPolygonMode polygonMode;
//剔除
//VK_CULL_MODE_FRONT_BIT
//VK_CULL_MODE_BACK_BIT
VkCullModeFlags cullMode;
//三角形的朝向由顶点的绕序
//VK_FRONT_FACE_COUNTER_CLOCKWISE
//VK_FRONT_FACE_CLOCKWISE
VkFrontFace frontFace;
//下面四个参数控制了深度偏移这一特性
VkBool32 depthBiasEnable;
float depthBiasConstantFactor;
float depthBiasClamp;
float depthBiasSlopeFactor;
//置线段图元的宽度
//一些 Vulkan 实现并不支持宽线段,会忽略这个字段
//设置为 1.0 以外的值时也许会运行得相当缓慢
//建议设置为 1 不变
//线段的最大宽度,Vulkan 标准保证至少支持 8 像素
float lineWidth;
} VkPipelineRasterizationStateCreateInfo;
VkPolygonMode
VK_POLYGON_MODE_FILL
VK_POLYGON_MODE_LINE
VK_POLYGON_MODE_POINT
VkPipelineMultisampleStateCreateInfotypedef struct VkPipelineMultisampleStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineMultisampleStateCreateFlags flags;
VkSampleCountFlagBits rasterizationSamples;
VkBool32 sampleShadingEnable;
float minSampleShading;
const VkSampleMask* pSampleMask;
VkBool32 alphaToCoverageEnable;
VkBool32 alphaToOneEnable;
} VkPipelineMultisampleStateCreateInfo;
深度测试在片段着色器运行之后发生
要在深度测试之前运行片段着色器,可以在片段着色器入口设置 SPIR-V EarlyFragmentTests 执行模式
VkPipelineDepthStencilStateCreateInfo
typedef struct VkPipelineDepthStencilStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineDepthStencilStateCreateFlags flags;
//深度测试启用 第 10 章
VkBool32 depthTestEnable;
VkBool32 depthWriteEnable;
VkCompareOp depthCompareOp;
VkBool32 depthBoundsTestEnable;
VkBool32 stencilTestEnable;
VkStencilOpState front;
VkStencilOpState back;
float minDepthBounds;
float maxDepthBounds;
} VkPipelineDepthStencilStateCreateInfo;
深度和模板测试可以在片段着色器运行之前或之后进行。默认情况下,深度测试在片段着 色器运行之后发生
VkPipelineColorBlendStateCreateInfotypedef struct VkPipelineColorBlendStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkPipelineColorBlendStateCreateFlags flags;
//色器的输出和颜色附件的内容之间是否进行逻辑操作 第十章
VkBool32 clogicOpEnable;
VkLogicOp logicOp;
uint32_t attachmentCount;
const VkPipelineColorBlendAttachmentState* pAttachments;
float blendConstants[4];
} VkPipelineColorBlendStateCreateInfo;
VkPipelineColorBlendAttachmentState//第 10 章
typedef struct VkPipelineColorBlendAttachmentState
{
VkBool32 blendEnable;
VkBlendFactor srcColorBlendFactor;
VkBlendFactor dstColorBlendFactor;
VkBlendOp colorBlendOp;
VkBlendFactor srcAlphaBlendFactor;
VkBlendFactor dstAlphaBlendFactor;
VkBlendOp alphaBlendOp;
//控制了把输出图像的哪个通道写入附件中
VkColorComponentFlags colorWriteMask;
} VkPipelineColorBlendAttachmentState;
VkPipelineDynamicStateCreateInfotypedef struct VkPipelineDynamicStateCreateInfo
{
//VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//为 0
VkPipelineDynamicStateCreateFlags flags;
//动态状态的个数
uint32_t dynamicStateCount;
//想要使用对应的动态状态设置命令来改变状态
const VkDynamicState* pDynamicStates;
} VkPipelineDynamicStateCreateInfo;
VkDynamicState
VK_DYNAMIC_STATE_VIEWPOR
vkCmdSetViewport() 更新VK_DYNAMIC_STATE_SCISSOR
vkCmdSetScissor()VK_DYNAMIC_STATE_LINE_WIDTH
vkCmdSetLineWidth()VK_DYNAMIC_STATE_DEPTH_BIAS
vkCmdSetDepthBias()vkCmdSetBlendConstants()vkCmdSetDepthBounds()vkCmdSetStencilCompareMask()vkCmdSetStencilWriteMask()vkCmdSetStencilReference()