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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值