Vulkan教程翻译之十二 编译 Shader

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/11-init_shaders.html

Shader

这一章节的代码文件是 11-init_shaders.cpp

把GLSL Shader 编译成 SPIR-V

对 Vulkan 来说,低级的 shader 代码表现为 SPIR-V。示例程序通过调用一个实用函数把用GLSL写的 shader 程序编译成 SPIR-V:

GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vertShaderText, vtx_spv);

shader 源码是在 vertShaderText 变量中,编译完的 SPIR-V 在 vtx_spv 里被返回,它是一个 unsigned int 类型的向量,适合存储 SPIR-V 代码。

查看示例代码,找到这个顶点着色器的着色器源,注意,还提供了片段着色器源,以及类似的调用编译它。

还要注意到,这些是简单的着色器。顶点着色器简单地把颜色传递出去,并且把输入的位置用我们在之前章节中看到的MVP进行转换。片段着色器更简单,就是透传颜色。

在这个简单的例子中,只有两个着色器阶段:顶点 和 片段,按这个顺序存在 info.shaderStages 中。

创建 Vulkan Shader Module

编译完的 shader 代码通过创建 VkShaderModule 被传给 Vulkan,并且存在一个 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 转换所返回的代码用来创建 shader module。相同的过程用来给 fragment shader 创建了一个 vkShaderModule,被存储在 info.shaderStages[1].module。

一些对 pipeline shader 阶段创建信息的额外初始化也在这时候被执行:

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";

此时,shader 准备完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值