Vulkan【12】着色器

着色器

本節的代碼是 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 intvector。

查看樣例代碼,以找到這個頂點着色器的着色器源碼,並注意到片段着色源碼也提供了,可以用類似的調用來編譯它。

還要注意,這些都是簡單的着色器。頂點着色器簡單地將顏色傳遞給它的輸出,並通過我們在前幾節中看到的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章