「SPIR-VからGLSLを生成する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
 
(同じ利用者による、間の1版が非表示)
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 / OpenGL 4.6==
+
==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 / OpenGL ES 3.0==
+
==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 / OpenGL ES 2.0 / WebGL 1.0==
+
==GLSL ES 1.00 (OpenGL ES 2.0 / WebGL 1.0) ==
次にOpenGL ES 2.0とWebGL 1.0向けのオプションも試してみる。
+
次に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  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
attributeとvaringを使った昔ながらの形式になった。
+
昔ながらのattributeとvaryingを使った形式になった。
 
<syntaxhighlight lang="glsl">
 
<syntaxhighlight lang="glsl">
 
#version 100
 
#version 100

2019年11月6日 (水) 00:41時点における版

SPIR-Vから様々なシェーディング言語逆コンパイルできると色々捗ると思われる。 SPIR-VHLSLGLSLから生成できるので相互変換もできることになる。 夢が広がりんぐ

準備

Vulkan SDKSPIR-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;
}

関連項目