着色器
本節的代碼是 11-init_shaders.cpp
編譯 GLSL 着色器 爲 SPIR-V
Vulkan的底層着色器代碼是SPIR-V。示例程序將GLSL編寫的着色器代碼編譯爲 SPIR-V,通過下面這個工具函數:
GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vertShaderText, vtx_spv);
The shader source code is in the vertShaderText
variable and the compiled SPIR-V is returned in vtx_spv
, which is a vector of unsigned int
and is suitable for storing the SPIR-V code.
着色器源碼在vertShaderText
變量中,編譯後的SPIR-V在返回的 vtx_spv
中。
vtx_spv
是一個unsigned int
vector。
查看樣例代碼,以找到這個頂點着色器的着色器源碼,並注意到片段着色源碼也提供了,可以用類似的調用來編譯它。
還要注意,這些都是簡單的着色器。頂點着色器簡單地將顏色傳遞給它的輸出,並通過我們在前幾節中看到的MVP變換來轉換傳入的頂點。片段着色器更簡單,只是傳遞顏色。
在這個簡單的示例中,只有兩個着色階段:頂點和片段階段,以info.shaderStages
的順序存儲。
創建 Vulkan 着色器模塊
編譯後的着色代碼通過創建一個VkShaderModule
並將其存儲在一個VkPipelineShaderStageCreateInfo
結構中,這個結構將在另一個示例中使用,並作爲創建整個圖形管道的一部分。
VkShaderModuleCreateInfo moduleCreateInfo;
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = NULL;
moduleCreateInfo.flags = 0;
moduleCreateInfo.codeSize = vtx_spv.size() * sizeof(unsigned int);
moduleCreateInfo.pCode = vtx_spv.data();
res = vkCreateShaderModule(info.device, &moduleCreateInfo, NULL,
&info.shaderStages[0].module);
注意,從GLSL到SPIR-V轉換的代碼用於創建着色器模塊。同樣的過程被用來爲片段着色器創建一個 vkShaderModule
,它存儲在info.shaderStages[1].module
中。
在此期間還執行了管道着色階段創建信息的一些額外初始化:
info.shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
info.shaderStages[0].pNext = NULL;
info.shaderStages[0].pSpecializationInfo = NULL;
info.shaderStages[0].flags = 0;
info.shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
info.shaderStages[0].pName = "main";
到這裏,着色器已經可以使用了。
© Copyright 2016 LunarG, Inc