「SPIR-VからGLSLを生成する」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
14行目: | 14行目: | ||
[[SPIR-V]]ファイルは「[[DirectX Shader CompilerでSPIR-Vを出力する]]」で生成したものを使った。[[GLSL]]ではなく[[HLSL]]から生成した[[SPIR-V]]ファイルだ。 | [[SPIR-V]]ファイルは「[[DirectX Shader CompilerでSPIR-Vを出力する]]」で生成したものを使った。[[GLSL]]ではなく[[HLSL]]から生成した[[SPIR-V]]ファイルだ。 | ||
− | ==GLSL 4.60 | + | ==GLSL 4.60 (OpenGL 4.6) == |
まずは最新のGLSL 4.60形式で出力してみる。 | まずは最新のGLSL 4.60形式で出力してみる。 | ||
ちなみにオプションを一切指定しない場合はGLSL 4.50となるようだ(2019年11月時点)。 | ちなみにオプションを一切指定しない場合はGLSL 4.50となるようだ(2019年11月時点)。 | ||
41行目: | 41行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | ==GLSL ES 3.00 | + | ==GLSL ES 3.00 (OpenGL ES 3.0) == |
OpenGL ES 3.0向けのオプションを指定して試してみる。 | OpenGL ES 3.0向けのオプションを指定して試してみる。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
67行目: | 67行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | ==GLSL ES 1.00 | + | ==GLSL ES 1.00 (OpenGL ES 2.0 / WebGL 1.0) == |
− | 次にOpenGL ES 2. | + | 次にOpenGL ES 2.0と[[WebGL]] 1.0向けのオプションも試してみる。 |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
./spirv-cross --version 100 --es light_vs.spv | ./spirv-cross --version 100 --es light_vs.spv |
2019年11月6日 (水) 00:41時点における版
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;
}