8. 着色器
一個着色器指定了在圖形和計算管線對應各階段的每個頂點、控制點、細分頂點、圖元、片元或者工作組 上執行的可程式設計的操作。
圖形管線包括作為primitive assembly結果的頂點着色器執行, 緊接着是在patches之上的 細分控制、求值着色器(如果開啟了)操作,作用在圖元之上的幾何着色器(如果開啟了), 操作于 Rasterization産生的片元之上的片元着色器。 在本規範中,頂細分控制、細分求值、幾何着色器都是指頂點處理階段,發生在邏輯管線中栅格化之前。 片元着色器程式在栅格化之後運作。
隻有計算着色器階段被包含在計算管線中。計算着色器操作一個工作組中的一些調用。
着色器可以從輸入變量中讀取,從輸出變量中讀取或者寫入。 輸入和輸出變量可以被用來在不同着色器階段之間轉移資料,或者允許着色器和執行環境中變量值直接互動。 同樣的,執行環境也提供了描述性能的常量。
着色器變量和執行環境提供的着色器内部_built-in_修飾的輸入和輸出變量相關。 對于每個階段可用的修飾符在下面小節中列出。
8.1. 着色器子產品
Shader modules 包含 shader code 和一個或多個入口點。 可通過指定一個入口點作為建立pipeline的一部分來從着色器子產品中選擇着色器。 管線的階段可以使用來自不同子產品的着色器。定義了一個着色器子產品的着色器代碼必須是SPIR-V格式, 在附錄 Vulkan Environment for SPIR-V 有描述。
着色器子產品通過
VkShaderModule
handles表示:
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule)
可調用如下指令來建立着色器子產品:
VkResult vkCreateShaderModule(
VkDevice device,
const VkShaderModuleCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkShaderModule* pShaderModule);
-
是建立着色器子產品的邏輯裝置。device
-
參數是一個指針,指向了一個pCreateInfo
類型的資料結構執行個體。VkShaderModuleCreateInfo
-
控制了主機端記憶體如何配置設定,如Memory Allocation一章所述。pAllocator
-
指向了一個pShaderModule
handle ,它接收傳回的着色器子產品。VkShaderModule
一旦着色器子產品被建立完成,它所包含的入口點在Compute Pipelines 和 Graphics Pipelines中描述的管線階段。
Valid Usage (Implicit)
-
must be a validdevice
handleVkDevice
-
must be a pointer to a validpCreateInfo
structureVkShaderModuleCreateInfo
- If
is notpAllocator
,NULL
must be a pointer to a validpAllocator
structureVkAllocationCallbacks
-
must be a pointer to apShaderModule
handleVkShaderModule
Return Codes
- Success
-
-
VK_SUCCESS
Failure -
-
-
VK_ERROR_OUT_OF_HOST_MEMORY
-
VK_ERROR_OUT_OF_DEVICE_MEMORY
-
VkShaderModuleCreateInfo
資料結構定義如下:
typedef struct VkShaderModuleCreateInfo {
VkStructureType sType;
const void* pNext;
VkShaderModuleCreateFlags flags;
size_t codeSize;
const uint32_t* pCode;
} VkShaderModuleCreateInfo;
-
是資料結構的類型sType
-
是pNext
或者指向一個指向拓展特定的資料結構的指針NULL
-
被保留flags
-
是codeSize
指明的代碼的大小,以位元組為機關pCode
-
指向了将用來建立着色器子產品的代碼。代碼的類型和格式由pCode
所指向的記憶體内容所決定pCode
正确使用
-
必須要大于0codeSize
-
必須是4的倍數 If the VK_NV_glsl_shader extension is enabled andcodeSize
references GLSL codepCode
can be a multiple of 1codeSize
-
must point to valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification. If the VK_NV_glsl_shader extension is enabledpCode
can instead reference valid GLSL code and must be written to the GL_KHR_vulkan_glsl extension specificationpCode
-
must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix. If the VK_NV_glsl_shader extension is enabledpCode
can be valid GLSL code with respect to the GL_KHR_vulkan_glsl GLSL extension specificationpCode
-
must declare thepCode
capability for SPIR-V codeShader
-
must not declare any capability that is not supported by the API, as described by the Capabilities section of the SPIR-V Environment appendixpCode
- If
declares any of the capabilities that are listed as not required by the implementation, the relevant feature mustbe enabled, as listed in the SPIR-V Environment appendixpCode
Valid Usage (Implicit)
-
must besType
VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
-
must bepNext
NULL
-
must beflags
-
must be a pointer to an array of \(codeSize \over 4\)pCode
valuesuint32_t
可調用如下指令來銷毀着色器子產品:
void vkDestroyShaderModule(
VkDevice device,
VkShaderModule shaderModule,
const VkAllocationCallbacks* pAllocator);
-
是銷毀着色器子產品的邏輯裝置device
-
是需要被銷毀的着色器子產品shaderModule
-
控制了CPU端記憶體配置設定,如 Memory Allocation 一章所述pAllocator
一個着色器子產品可以在使用它的着色器的管線仍在使用中的時候被銷毀。
正确使用
- If
were provided whenVkAllocationCallbacks
was created, a compatible set of callbacks must be provided hereshaderModule
- If no
were provided whenVkAllocationCallbacks
was created,shaderModule
must bepAllocator
NULL
Valid Usage (Implicit)
-
must be a validdevice
handleVkDevice
- If
is notshaderModule
,VK_NULL_HANDLE
must be a validshaderModule
handleVkShaderModule
- If
is notpAllocator
,NULL
must be a pointer to a validpAllocator
structureVkAllocationCallbacks
- If
is a valid handle, it must have been created, allocated, or retrieved fromshaderModule
device
Host Synchronization
- Host access to
must be externally synchronizedshaderModule