最佳工具就在我的 vulkan sdk 里面,我居然没发现!小丑竟是我自己!
其实情有可原,百度基本没找到该工具的相关信息。因为属于vulkan时代的新东西,还很少人用把。
可以同时用于vulkan和opengl 4.6,其他opengl版本可以开启相关的spirv扩展以获得支持。
该工具名为 glslc 位于 vulkan sdk 中
vulkan sdk 地址:https://vulkan.lunarg.com/sdk/home
这个工具可以让你像编译c文件一样编译glsl文件到spirv字节码文件,同时支持 #include 指令,并且附加了更多的增强功能。
该工具可以准确的指出你的错误是位于源文件还是位于头文件中。
opengl 4.6 核心支持 spirv 着色器。opengl 4.5或更低版本可以通过扩展来开启spirv着色器支持。
glslc 工具开源仓库,有非常详细的参数说明。
https://github.com/google/shaderc/tree/main/glslc
注意,opengl 中使用需要使用分离式 program。
该工具也支持编译 hlsl 文件
该工具具有一个 libshaderc 的C链接库,允许你在程序在运行时对 glsl 源文件链接生成 spirv 着色器字节码。从而无须扩展 ARB_shading_language_include
libshaderc C链接库开源仓库
https://github.com/google/shaderc
使用示例:
头文件 a.h
顶点着色器源文件 b.vert
a.h
mat4 func(mat4 m1, mat4 m2)
{
return m1 * m2;
}
b.vert
#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_EXT_scalar_block_layout : enable
#include "a.h"
layout(location = 0) in vec3 in_pos;
layout(location = 1) in vec3 in_color;
layout(location = 0) out vec4 out_pos;
layout(location = 1) out vec3 out_color;
layout(set=0, binding=0, std430) uniform _cam_param
{
mat4 model_mat;
mat4 view_proj_mat;
};
void main()
{
mat4 mvp_mat = func(view_proj_mat, model_mat);
out_pos = mvp_mat * vec4(in_pos, 1.0);
out_color = in_color;
gl_Position = out_pos;
}
编译为b_vert.spv文件
glslc -o b_vert.spv b.vert
完成。