DreamShaderLang
DreamShaderLang 2.0

从 1.x 迁移

dsc migrate 把 .dsm、.dsf、.dsh 源文件改写成 .dss —— 并且在写任何东西之前先证明:注释一条不丢,生成的图一模一样。

dsc migrate 把 .dsm、.dsf 与 .dsh 文件改写成 DreamShaderLang 2.0。没有任何东西逼你迁移: legacy 前端会继续用同一个编译器构建 1.x 源码,而且 .dsh 可以同时装两种语言,所以一个工程可以一次只搬一个文件。

./dsc.ps1 migrate DShader/Materials/M_Foo.dsm -Check    # 只证明改写可行,什么都不写
./dsc.ps1 migrate DShader/Materials/M_Foo.dsm           # 写出 M_Foo.dss,把 M_Foo.dsm 挪走
./dsc.ps1 migrate -All -Check                           # 工程自己的源码根下全部 1.x 源文件
./dsc.ps1 migrate -Root MoonToon -Check                 # 指定一个源码根,按它的名字或所属插件名
开关含义
一个文件单个 1.x 源文件。它 import 的头文件只有在没有别的文件 include 时才会一起迁移。
-All可写源码根(即工程自己的)下的全部 1.x 源文件。插件的源码根不在其内。
-Root某一个源码根下的全部 1.x 源文件,按根的显示名或其插件名指定
-Check除了写盘什么都做;退出码说明是否每个文件都能迁移
-DryRun报告将会写出什么
-Out把 .dss 写到指定目录下(镜像源码树),1.x 文件原地不动
-NoBackup直接删除 1.x 文件,而不是挪到 Saved/DreamShader/Migrated/

落盘之前先证明什么

注释一条不丢。 拿源文件的注释逐条去对结果里的注释(DSH9092)。

文本能按 2.0 编过。 由 2.0 前端解析、绑定、降级(DSH9097)。被拒的文本会留在 Saved/DreamShader/Migrated/Rejected/ 下,诊断指向它。

编出同一张图。 1.x 文件的 IR 和新文本的 IR 从根开始逐节点比较(DSH9098,警告,指出第一个不同的节点)。 同一个资产的两种写法不算差异:引脚上的字面量与它的 Const* 孪生属性、恒等 swizzle、Custom 节点代码里的空白。

资产留在原处。 如果新文件所在位置会推导出另一个资产路径,导出函数会带上保住原路径的 /// @name。

带 #if 行的源文件会被拒绝(DSH9090):否则只有今天被选中的那个分支能活下来。

改写做了什么

1.x.dss
import "x.dsh";#include "x.dsh"
带 Properties / Settings / Outputs / Graph 的 Shader(Name = "...")#pragma material(...)、带 /// 指令的 uniform、一个 export void M(inout material Base)
ShaderFunction 的输入与输出形参;名为 Result 的第一个输出是返回值,其余是 out
Function / GraphFunction/// @custom,函数体原样保留
Namespace(Name = "N") 里的 Function FN_F,并加 /// @name N::F,让 Custom 节点保住标题
VirtualFunction/// @asset + extern 原型
mix、fract、mod、vec3lerp、frac、fmod、float3
opt float S;float S = 0.0
SAMPLERTYPE_Normal、PPI_SceneColorNormal、SceneColor
float4 放进 float3 的位置.rgb —— 1.x 悄悄截断,2.0 要求把 swizzle 写出来
没有任何地方声明过 x 的 x = value;T x = value;

以上每一条在 1.x 源文件上同时也是一条诊断,所以对 .dsm 跑一次 dsc check 就能看到迁移会改什么。 注释留在它原先挨着的语句或声明旁边。

在开发工程的四个源码根上实测 —— 71 个文件:71 个全部能按 2.0 编过,68 个比较相等, 另外三条警告是改写让它们显形的真实差异。

本页目录