Vulkan着色器介绍(2)

一、简介
在上一节中,我们介绍了顶点着色器和片段着色器的写法,以及颜色数组的使用等内容,这些与OpenGL中的别无二致,那么接下来我们对其继续进行探讨。

二、Vulkan着色器
shader.vert文件:
#version 450
#extension GL_ARB_sparate_shader_objects:enable
out gl_PerVertex{
vec4 gl_Position;
};
layout(location = 0) out vec3 fragColor;
vec2 positions[3] = vec2[](
vec2(0.0,-0.5),
vec2(0.5,0.5),
vec2(-0.5,0.5)
);
vec3 colors[3] = vec3[](
vec3(1.0,0.0,0.0),
vec3(0.0,1.0,0.0),
vec3(0.0,0.0,1.0)
);
void main(){
gl_Position = vec4(positions[gl_VertexIndex],0.0,1.0);
fragColor = colors[gl_VertexIndex];
)

shader.frag文件:
#version 450
#extersion GL_ARB_separate_shader_objects:enable
layout(location = 0) in vec3 fragColor;
layout(location = 0) out vec4 outColor;
void main(){
outColor = vec4(fragColor,1.0);
}
接下来我们将尝试使用glslangValidator程序编译SPIR-V二进制码。
C:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.vert
C:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.frag
pause

加载着色器:
我们已经有了一种产生SPIR-V着色器的方法,接下来需要将其加载到我们的程序中,以便在适当的时候插入到图形管线中。首先我们需要编写一个辅助函数用以加载二进制数据文件。
#include

static std::vector readFile(const std::string& filename){
std::ifstream file(filename,std::ios::ate | std::ios::binary);
if(!file.is_open()){
throw std::runtime_error(“failed to open file!”);
}
}
加载着色器的二进制码:
void createGraphicsPipeline(){
auto vertShaderCode = readFile(“shaders/vert.spv”);
auto fragShaderCode = readFile(“shaders/frag.spv”);
}
创建着色器模型:
在将代码传递给渲染管线之前,我们必须将其封装到VkShaderModule对象中:
VkSahderModule createShaderModule(const std::vector& code){}
创建shader module是比较简单的,我们仅仅需要指定二进制码缓冲区的指针和它的具体长度。这些信息被填充在了VkShaderModuleCreateInfo结构体中。
VkShaderModuleCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
createInfo.codeSize = code.size();
createInfo.pCode = reinterpret_cast<const uint32_t*> (code.data());
调用vkCreateShaderModule创建VkShaderModule:
VkShaderModule shaderModule;
if(vkCreateShaderModule(device,&createInfo,nullptr,&shaderModule)!=VK_SUCCESS){
throw std::runtime_error(“failed to create shader module!”);
}

着色器阶段创建:
VkShaderModule对象只是字节码缓冲区的一个包装容器,着色器并没有彼此链接。通过VkPipelineShaderStageCreateInfo结构将着色器模块分配到管线中的顶点或者片段着色器阶段。VkPipelineShaderStageCreateInfo结构体是实际管线创建过程的一部分。
createGraphicsPipeline函数中填写顶点着色器结构体:
VkPipelineShaderStageCreateInfo vertShaderStageInfo = {};
vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
verShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;

发布了146 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/103785972