Archive for 2020 年 9 月

独立的GLSL编译工具

5 9 月, 2020

由于使用SPIRV-Cross以及glslang的源代码版本有太多的编译配置选项,很烦,所以我制作了一个动态链接库版的GLSL到SPV编译器。

Github仓库

下载链接

使用代码大致如下:

namespace glsl_compiler
{
enum class DescriptorType //等同VkDescriptorType
{
SAMPLER = 0,
COMBINED_IMAGE_SAMPLER = 1,
SAMPLED_IMAGE = 2,
STORAGE_IMAGE = 3,
UNIFORM_TEXEL_BUFFER = 4,
STORAGE_TEXEL_BUFFER = 5,
UNIFORM_BUFFER = 6,
STORAGE_BUFFER = 7,
UNIFORM_BUFFER_DYNAMIC = 8,
STORAGE_BUFFER_DYNAMIC = 9,
INPUT_ATTACHMENT = 10,

BEGIN_RANGE=SAMPLER,
END_RANGE=INPUT_ATTACHMENT,
RANGE_SIZE=(END_RANGE-BEGIN_RANGE)+1
};

enum class VertexAttribBaseType
{
Bool=0,
Int,
UInt,
Float,
Double,
};//enum class VertexAttribBaseType

struct ShaderStage
{
char name[128];
uint8_t location;
uint32_t basetype; //对应enum class VertexAttribBaseType
uint32_t vec_size;
};//

struct ShaderStageData
{
uint32_t count;
ShaderStage *items;
};

struct ShaderResource
{
char name[128];

uint8_t set;
uint8_t binding;
};

struct ShaderResourceData
{
uint32_t count;
ShaderResource *items;
};

struct SPVData
{
bool result;
char *log;
char *debug_log;

uint32_t *spv_data;
uint32_t spv_length;

ShaderStageData input,output;
ShaderResourceData resource[size_t(DescriptorType::RANGE_SIZE)];
};

struct GLSLCompilerInterface
{
bool (*Init)(); ///<初始化
void (*Close)(); ///<关闭

uint32_t (*GetType)(const char *ext_name); ///<根据扩展名获取SHADER类型
SPVData * (*Compile)(const uint32_t type,const char *source); ///<编译glsl

void (*Free)(SPVData *); ///<释放数据
};
}//namespace glsl_shader

使用方法:

  1. 加载动态链接库
  2. 从动态链接库获取GetInterface函数
  3. 用GetInterface函数得到一个GLSLCompilerInterface指针(以下简称GSI)
  4. 调用GSI::Init函数
  5. 自行加载glsl的文本,并保证为ansi或utf8字符集
  6. 截取glsl文件扩展名(不包括.),或自行传递一个字符串给GSI::GetType函数,以获取shader类型。
    shader文件扩展名规则同glslangValidator

    • vert 顶点
    • tesc 镶嵌控制
    • tese 镶嵌评估
    • geom 几何
    • frag 片断
    • comp 计算
    • task 任务
    • mesh 网格
  7. 调用GSI::Compile函数,并同时传递shader类型以及shader文本字符串
  8. 根据得到的SPVData::result来判断是否成功
    • result为false表示失败,在log/debug_log中包含返回的错误信息
    • result为true表示成功,在spv_data,spv_length中包含编译好的spv数据
  9. 自行处理spv数据
  10. 调用GSI::Free释放SPVData指针
鄂ICP备09027626号