这篇文章搞了半天图死活生成不出来,最后发现居然是plantuml中的“<”形状符号和markdown冲突了,淦…
这个问题把我给整累了,不想写太多了,直接看图,其实也没有整理的很详细,Unreal的HLSLCC代码写得还是挺好的,就是每次编shader的时候会拉起一个独立的处理进程这个操作挺骚气的。
[plantuml]
title Unreal HLSLCC\nhttps://tis.ac.cn/blog/kongdeyou/hlslcc_unreal_simple/
:HLSL>
:MCPP Preprocess;
split
:D3DShaderCompiler|
kill
split again
:mesa_hlsl_parse(..);
note right
HLSL -> AST
end note
:mesa_ast_to_hir(..);
note right
AST -> IR
end note
:Optimization;
:class ir_visitor {..};
split
:ir_gen_glsl_visitor;
:visitor.run(..);
:GLSL>
:OpenGLShaderCompiler|
kill
split again
:FGenerateVulkanVisitor;
note right
copy from ir_gen_glsl_visitor
end note
:visitor.run(..);
:GLSL>
:VulkanShaderCompiler|
kill
split again
:FGenerateMetalVisitor;
:visitor.run(..);
:MSL>
:MetalShaderCompiler|
kill
end split
end split
[/plantuml]
还可以参考Unreal的这篇官方文章:
https://docs.unrealengine.com/zh-CN/ProgrammingAndScripting/Rendering/ShaderDevelopment/HLSLCrossCompiler/index.html
gnm的PSSL即PS4平台,shader是HLSL的变体,相似度极高,Unreal和Unity都选择采用简单的宏替换的方式处理,Unreal的HLSLCC在MCPP Preprocess的时候就把它处理好了,不会做IR的生成和转换。
协议
本文以上内容遵循CC BY-ND 4.0协议,署名-禁止演绎。
转载请注明出处:https://tis.ac.cn/blog/kongdeyou/hlslcc_unreal_simple/
并署名:kongdeyou(https://tis.ac.cn/blog/author/kongdeyou/)