这篇文章搞了半天图死活生成不出来,最后发现居然是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/)
 
                 
            