当前位置: 首页 > news >正文

VulKan笔记(九)-着色器

        Vulkan 中的着色器代码必须在字节码中指定格式,而不是 GLSL 和 HLSL 等可读语法。顶点着色器与片元着色器,我这里使用的是GLSL语法格式。这个不做过多解释了。自己查阅GLSL相关资料。当你写好比如:shader.vert 与 shader.frag 着色器文件。用Vulkan SDK bin目录下的编译工具转换成字节码格式。创建一个compile.bat脚本文件执行。如下绘制一个三角形硬编码的着色器文件。绘制三角形的着色器代码。

shader.vert

#version 450
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
layout(location = 0) in vec3 fragColor;
layout(location = 0) out vec4 outColor;
void main() {outColor = vec4(fragColor, 1.0);
}

编译字节码执行脚本

C:/VulkanSDK/x.x.x.x/Bin/glslc.exe shader.vert -o vert.spv
C:/VulkanSDK/x.x.x.x/Bin/glslc.exe shader.frag -o frag.spv
pause

创建shader着色器 就是两块内存设置顶点着色器与片元着色器字节码数据

VkShaderModule CVulkanApp::createShaderModule(const std::string strShader)
{VkShaderModuleCreateInfo createInfo{};createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;createInfo.codeSize = strShader.size();createInfo.pCode = reinterpret_cast<const uint32_t*>(strShader.data());VkShaderModule shaderModule;if (vkCreateShaderModule(logicDevice_, &createInfo, nullptr, &shaderModule) != VK_SUCCESS){throw std::runtime_error("failed to create shader module!!!");}return shaderModule;
}

渲染管道创建的时候要把着色器创建对象赋值给管道,通过设置VkPipelineShaderStageCreateInfo分别按照不同类型设置着色器。

CShader shader = CShader("shaders/test.vs.spv", "shaders/test.fs.spv");VkShaderModule vsModule = createShaderModule(shader.GetVS());VkShaderModule fsModule = createShaderModule(shader.GetFS());VkPipelineShaderStageCreateInfo vsShaderStageInfo{};vsShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;vsShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;vsShaderStageInfo.module = vsModule;vsShaderStageInfo.pName = "main";vsShaderStageInfo.flags = 0;vsShaderStageInfo.pNext = nullptr;vsShaderStageInfo.pSpecializationInfo = nullptr;VkPipelineShaderStageCreateInfo fsShaderStageInfo{};fsShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;fsShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT;fsShaderStageInfo.module = fsModule;fsShaderStageInfo.pName = "main";fsShaderStageInfo.flags = 0;fsShaderStageInfo.pNext = nullptr;fsShaderStageInfo.pSpecializationInfo = nullptr;

最后把fsShaderStageInfo填充给图形管道。

销毁着色器

 vkDestroyShaderModule(logicDevice_, vsModule, nullptr);vkDestroyShaderModule(logicDevice_, fsModule, nullptr);

http://www.dtcms.com/a/339738.html

相关文章:

  • Qt消息队列
  • MySQL深分页性能优化实战:大数据量情况下如何进行优化
  • MySQL 三大日志:redo log、undo log、binlog 详解
  • 面试题储备-MQ篇 1-说说你对RabbitMQ的理解
  • 3D检测笔记:MMDetection3d环境配置
  • 基于单片机智能手环/健康手环/老人健康监测
  • DataSourceAutoConfiguration源码笔记
  • 47 C++ STL模板库16-容器8-关联容器-集合(set)多重集合(multiset)
  • Lec. 2: Pytorch, Resource Accounting 课程笔记
  • 告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI
  • 一文速通Ruby语法
  • GeoTools 读取影像元数据
  • 常见 GC 收集器与适用场景:从吞吐量到亚毫秒停顿的全景指南
  • Kotlin 相关知识点
  • 驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数
  • 从“为什么”到“怎么做”——Linux Namespace 隔离实战全景地图
  • [激光原理与应用-309]:光学设计 - 什么是光学系统装配图,其用途、主要内容、格式与示例?
  • 线性基 系列
  • Java static关键字
  • OptiTrack光学跟踪系统,提高机器人活动精度
  • 讯飞星火语音大模型
  • CAD图纸如何批量转换成PDF格式?
  • 机器学习概念(面试题库)
  • 部署tomcat应用时注意事项
  • vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
  • t-SNE详解与实践【附代码】
  • 自定义组件可使用的方法
  • 在 Python 中操作 Excel 文件的高效方案 —— Aspose.Cells for Python
  • 《P1550 [USACO08OCT] Watering Hole G》
  • Java开发过程中实用的技术点(一)