SPIR-VからGLSLを生成する
2019年11月6日 (水) 00:41時点におけるAdministrator (トーク | 投稿記録)による版
SPIR-Vから様々なシェーディング言語に逆コンパイルできると色々捗ると思われる。 SPIR-VはHLSLとGLSLから生成できるので相互変換もできることになる。 夢が広がりんぐ。
目次
準備
Vulkan SDKにSPIR-VからGLSLを生成する逆コンパイラが含まれている。 まずはダウンロードだ。今回はmacOS版をダウンロードしてきた。
Vulkan SDKを展開すると以下に逆コンパイラがある(mac版の場合)。
./macOS/bin/spirv-cross
SPIR-Vファイルは「DirectX Shader CompilerでSPIR-Vを出力する」で生成したものを使った。GLSLではなくHLSLから生成したSPIR-Vファイルだ。
GLSL 4.60 (OpenGL 4.6)
まずは最新のGLSL 4.60形式で出力してみる。 ちなみにオプションを一切指定しない場合はGLSL 4.50となるようだ(2019年11月時点)。
./spirv-cross --version 460 light_vs.spv
ちゃんと出た。
#version 460
layout(binding = 0, std140) uniform type_Globals
{
layout(row_major) mat4 WorldViewProjection;
} _Globals;
layout(location = 0) in vec4 in_var_POSITION0;
layout(location = 1) in vec4 in_var_COLOR0;
layout(location = 0) out vec4 out_var_COLOR0;
void main()
{
gl_Position = _Globals.WorldViewProjection * in_var_POSITION0;
out_var_COLOR0 = in_var_COLOR0;
}
GLSL ES 3.00 (OpenGL ES 3.0)
OpenGL ES 3.0向けのオプションを指定して試してみる。
./spirv-cross --version 300 --es light_vs.spv
こちらもちゃんと出た。GLSL4.60指定時と比べるとout部分が異なる。
#version 300 es
layout(std140) uniform type_Globals
{
layout(row_major) mat4 WorldViewProjection;
} _Globals;
layout(location = 0) in vec4 in_var_POSITION0;
layout(location = 1) in vec4 in_var_COLOR0;
out vec4 out_var_COLOR0;
void main()
{
gl_Position = _Globals.WorldViewProjection * in_var_POSITION0;
out_var_COLOR0 = in_var_COLOR0;
}
GLSL ES 1.00 (OpenGL ES 2.0 / WebGL 1.0)
次にOpenGL ES 2.0とWebGL 1.0向けのオプションも試してみる。
./spirv-cross --version 100 --es light_vs.spv
昔ながらのattributeとvaryingを使った形式になった。
#version 100
struct type_Globals
{
mat4 WorldViewProjection;
};
uniform type_Globals _Globals;
attribute vec4 in_var_POSITION0;
attribute vec4 in_var_COLOR0;
varying vec4 out_var_COLOR0;
void main()
{
gl_Position = in_var_POSITION0 * _Globals.WorldViewProjection;
out_var_COLOR0 = in_var_COLOR0;
}