ホーム
おまかせ表示
ログイン
設定
MonoBookについて
免責事項
MonoBook
検索
「
SPIR-VからHLSLを生成する
」を編集中
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
[[SPIR-V]]から様々な[[シェーディング言語]]に[[逆コンパイル]]できると色々捗ると思われる。 [[SPIR-V]]は[[HLSL]]と[[GLSL]]から生成できるので相互変換もできることになる。 [[夢が広がりんぐ]]。 ==準備== [[Vulkan]] [[SDK]]に[[SPIR-V]]から[[GLSL]]を生成する[[逆コンパイラ]]が含まれている。 まずは[[ダウンロード]]だ。今回は[[macOS]]版をダウンロードしてきた。 *https://vulkan.lunarg.com/sdk/home Vulkan SDKを展開すると以下に逆コンパイラがある(mac版の場合)。 ./macOS/bin/spirv-cross [[SPIR-V]]ファイルは「[[DirectX Shader CompilerでSPIR-Vを出力する]]」で生成したものを使った。[[GLSL]]ではなく[[HLSL]]から生成した[[SPIR-V]]ファイルだ。 spirv-crossのHLSL変換は「[[シェーダーモデル]]3.0以降」をサポートしている。 == SM 6.0 == 実行 <syntaxhighlight lang="bash"> ./spirv-cross --hlsl --shader-model 60 light_vs.spv </syntaxhighlight> 結果。出力用の変数にgl_PositionなどのGLSLのシステム変数名が使われている。なかなか衝撃的な[[ソースコード]]だ。 <syntaxhighlight lang="hlsl"> cbuffer type_Globals : register(b0, space0) { column_major float4x4 _Globals_WorldViewProjection : packoffset(c0); }; static float4 gl_Position; static float4 in_var_POSITION0; static float4 in_var_COLOR0; static float4 out_var_COLOR0; struct SPIRV_Cross_Input { float4 in_var_POSITION0 : TEXCOORD0; float4 in_var_COLOR0 : TEXCOORD1; }; struct SPIRV_Cross_Output { float4 out_var_COLOR0 : TEXCOORD0; float4 gl_Position : SV_Position; }; void vert_main() { gl_Position = mul(in_var_POSITION0, _Globals_WorldViewProjection); out_var_COLOR0 = in_var_COLOR0; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { in_var_POSITION0 = stage_input.in_var_POSITION0; in_var_COLOR0 = stage_input.in_var_COLOR0; vert_main(); SPIRV_Cross_Output stage_output; stage_output.gl_Position = gl_Position; stage_output.out_var_COLOR0 = out_var_COLOR0; return stage_output; } </syntaxhighlight> == SM 3.0 == 実行 <syntaxhighlight lang="bash"> ./spirv-cross --hlsl --shader-model 30 light_vs.spv </syntaxhighlight> 結果。 <syntaxhighlight lang="hlsl"> cbuffer type_Globals : register(b0) { column_major float4x4 _Globals_WorldViewProjection : packoffset(c0); }; uniform float4 gl_HalfPixel; static float4 gl_Position; static float4 in_var_POSITION0; static float4 in_var_COLOR0; static float4 out_var_COLOR0; struct SPIRV_Cross_Input { float4 in_var_POSITION0 : TEXCOORD0; float4 in_var_COLOR0 : TEXCOORD1; }; struct SPIRV_Cross_Output { float4 out_var_COLOR0 : TEXCOORD0; float4 gl_Position : POSITION; }; void vert_main() { gl_Position = mul(in_var_POSITION0, _Globals_WorldViewProjection); out_var_COLOR0 = in_var_COLOR0; gl_Position.x = gl_Position.x - gl_HalfPixel.x * gl_Position.w; gl_Position.y = gl_Position.y + gl_HalfPixel.y * gl_Position.w; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { in_var_POSITION0 = stage_input.in_var_POSITION0; in_var_COLOR0 = stage_input.in_var_COLOR0; vert_main(); SPIRV_Cross_Output stage_output; stage_output.gl_Position = gl_Position; stage_output.out_var_COLOR0 = out_var_COLOR0; return stage_output; } </syntaxhighlight> == 備考 == [[SPIR-V]]経由で出力したコードを比較した限りでは以下のような結論に達した。 * HLSLで書く * HLSLはHLSLのまま使う * HLSLからGLSLを生成する 比較量は少ないでまだ正確なことは言えないが、 GLSLで書いてHLSLへ変換という逆パターンは危険そうな雰囲気がある。 == 関連項目 == * [[SPIR-VからHLSLを生成する]] * [[GLSLのversionディレクティブ一覧]] * [[DirectX Shader CompilerでSPIR-Vを出力する]] * [[MacでDirectX Shader Compilerをビルドする]] * [[MacにMoltenVKを入れてVulkanを使ってみる]] [[category: 3DCG]] [[category: シェーディング言語]] [[category: SPIR-V]] [[category: HLSL]] [[category: Vulkan]]
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)