首页 > 编程语言 >关于Vulkan应用程序运行时编译GLSL Shader文件的方法

关于Vulkan应用程序运行时编译GLSL Shader文件的方法

时间:2024-11-13 20:30:59浏览次数:1  
标签:GLSL moduleCreateInfo vertResult 程序运行 Shader 编译 Vulkan 着色器

最近在学习Vulkan,在相关参考书中给出的示例代码因为使用的VulkanSDK较老,出现无法构建成功的问题。而且示例代码给出的Vulkan应用程序运行时编译GLSL Shader文件的方法放在现在已经是非常的麻烦。现在新版的VulkanSDK(1.3.X以上)将GLSL编译为SPIR-V非常方便了,可以使用Google提供的ShaderC库来更方便的编译:

//头文件导入
#include <shaderc/shaderc.hpp>//这个头文件位于VulkanSDK的Include文件夹内
#include <span>

//实例化一个编译器对象
shaderc::Compiler compiler;
//编译定点着色器,参数分别是着色器代码字符串,着色器类型,文件名
auto vertResult = compiler.CompileGlslToSpv(FileUtil::loadAssetStr(vs), shaderc_glsl_default_vertex_shader, vs);
auto errorInfo=vertResult.GetErrorMessage();
//可以加判断,如果有错误信息(errorInfo!=""),就抛出异常
std::cout<<errorInfo;
std::span<const uint32_t> vert_spv = {vertResult.begin(), size_t(vertResult.end() - vertResult.begin()) * 4};
//填充着色器模块创建信息结构体
VkShaderModuleCreateInfo moduleCreateInfo;// 准备顶点着色器模块创建信息
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = nullptr;// 自定义数据的指针
moduleCreateInfo.flags = 0;    
moduleCreateInfo.codeSize = vert_spv.size();// 顶点着色器SPV数据总字节数
moduleCreateInfo.pCode = vert_spv.data(); // 顶点着色器SPV数据

链接shaderc_shared.lib库文件(这里使用CMake,其他构建工具同理)

target_link_libraries({VULKAN_SDK}/Lib/shaderc_shared.lib)

附上一个在Vulkan中实践图形学的代码仓:gitee.com/Ruemo/vulkan-book-code

标签:GLSL,moduleCreateInfo,vertResult,程序运行,Shader,编译,Vulkan,着色器
From: https://www.cnblogs.com/IRuemoI/p/18544741

相关文章

  • Python语法:循环语句,掌握程序运行的节奏
    引言在当今数字化飞速发展的时代,编程已经成为一项不可或缺的技能,而Python作为一门简洁、高效且应用广泛的编程语言,备受开发者青睐。循环语句是Python编程中的基础结构之一,它在数据处理、算法实现、自动化任务等众多场景中都发挥着至关重要的作用。无论是专业的软件开发人员......
  • linux 计算程序运行时间, 及时间差
    linux计算程序运行时间,及时间差统计Shell脚本执行时间,帮助分析改进脚本执行linuxshell计算时间差值#!/bin/bash#计算时间差date1=$(date+"%Y-%m-%d%H:%M:%S")echo"时间1:$date1"echo"延时10s"sleep10date2=$(date+"%Y-%m-%d%H:%M:%S")echo"时间2......
  • OpenGL 和 GLSL 在顶点着色器中动态调整裁剪平面参数的简单代码示例
    以下是一个使用OpenGL和GLSL在顶点着色器中动态调整裁剪平面参数的简单代码示例://OpenGL初始化代码#include<GL/glew.h>#include<GLFW/glfw3.h>#include<iostream>GLFWwindow*window;//初始化GLFWvoidinitGLFW(){if(!glfwInit()){std::cer......
  • 用GLSL 和 GLM 实现OpenGL trackball
    以下是一个使用GLSL(OpenGLShadingLanguage)和GLM(OpenGLMathematics)库来实现OpenGLtrackball功能的示例。这个示例将展示如何通过鼠标操作来旋转场景中的物体,就像在操作一个虚拟的轨迹球一样。1.准备工作包含必要的头文件和库:需要包含GLFW头文件用于创建窗口和处理事件,GLA......
  • Qml-ShaderEffect的使用
    Qml-ShaderEffect的使用ShaderEffect的概述ShaderEffect使用自定义的顶点和片段着色器用于渲染一个矩形。用于在qml场景中添加阴影、模糊、着色和页面卷曲等效果。Qt5和Qt6中ShaderEffect有一定区别,在Qt6中由于支持不同的渲染API,ShaderEffect是用统一的qsb文件来满足对......
  • Unity 5.6 Basic shader framework
    UnityShader参考入口VertexandfragmentshaderShader"Unlit/NewUnlitShader"{Properties{_MainTex("Texture",2D)="white"{}}SubShader{Tags{"RenderType"="Opaque&quo......
  • ShaderType与Queue区别
    RenderType与Queue的区别指定RenderType的名称,主要是为了替换渲染方式;而Queue是设定渲染顺序。RenderTypeRenderType通常使用的值包括:Opaque:用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。Transparent:用于半透明着色器(透明着色器、粒子着色......
  • Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching)
    前言好久没有更新博客了,经历了不少事情,好在最近回归了一点正轨,决定继续UnityShader的学习之路。作为回归的第一篇,来玩一个比较酷炫的效果(当然废话也比较多),一般称之为GodRay(圣光),也有人叫它云隙光,还有人叫它体积光(探照灯)。这几个名字对应几种类似的效果,但是实现方式相差甚远。先来......
  • Unity Shader深度图的应用,手把手教你写出可以正确计算并且渲染出二次元角色边缘光的着
    梦开始的地方相信大家看番的时候,都注意到了,很多时候,在角色周围有一圈光晕旧版《魔术快斗》剧照《新蔷薇少女》剧照 我们将这种光晕,称之为边缘光边缘光是描边的一种,动画师之所以加入边缘光,是为了凸现角色轮廓,使得角色区别于背景不少游戏也有着这种边缘光游戏《鸣潮》......
  • Shader内容释义
    //Shader名称:(Hidden/)+UniversalRenderPipeline/+(路径)/+功能名称(首字母大写驼峰式)Shader"UniversalRenderPipeline/CodingSpecification"//Shader"Hidden/UniversalRenderPipeline/CodingSpecification"{Properties{ //材质属性:_+首字母大写驼......