UE 里的材质图不是 GPU 能直接执行的东西。比如你在材质编辑器里连了几个节点:
TextureSample
|
Multiply ---- VectorParameter(Color)
|
BaseColor
GPU 不认识"节点连线"。GPU 最后只能执行 shader 代码,比如 HLSL:
float4 Tex = Texture.Sample(Sampler, UV);
float3 BaseColor = Tex.rgb * Color.rgb;
HLSLTranslator 做的事,就是把上面的"节点连线"变成下面的"HLSL 代码"。
它的位置是:
材质编辑器节点
|
v
HLSLTranslator:把节点翻译成 HLSL
|
v
Shader Compiler:把 HLSL 编译成 GPU 字节码
|
v
GPU 执行
MaterialExpression 节点:
我表达"我要干什么"
HLSLTranslator:
我把你说的话翻译成 HLSL 代码
ShaderCompiler:
我把 HLSL 编译成 GPU 能执行的机器码 机器码就是对应的编译好的二进制shader数据
Render/RHI:
我在运行时把 shader 绑上去并 draw
GPU:
我真正执行这些 shader 指令
HLSL 源码:人能读的 shader 代码
Shader bytecode:编译好的二进制 shader 数据
RHI shader object:运行时 API 可绑定的 shader 对象
Draw/Dispatch:真正让 GPU 开始执行
Draw -> 一定是 graphics pipeline,提交到 graphics queue
Dispatch -> 一定是 compute pipeline,但不一定是 async compute queue
但 Dispatch 有两种可能:
普通 Compute:排在 graphics queue 里执行
Async Compute:排到 async compute queue 里执行