虚幻引擎的文本材质语言

DreamShaderLang

用文本写 Unreal 材质:2.0 的 .dss 就是加了 /// 注解和 #pragma 的 HLSL,1.x 的 .dsm / .dsf 照样能用。DreamShader 插件在编辑器里编译它们,生成标准的 UMaterial、UMaterialFunction、材质层与材质实例。源文件是唯一的编辑面,资产是构建产物,随时可以丢掉重建。

  • DreamShader2.2.0
  • VSCode2.2.0
  • UE5.3 – 5.8
  • LicenseMIT
DreamShader 形象:一位黑色长发的少女倚着刻有 DreamShader 字样的黑色立柱,掌心上方悬着一颗棋盘格小球

DreamShader · Text to UE Materials

往下看

长什么样

一个 .dss 文件,就是一份材质

下面是手册里的一个完整材质:#pragma 定材质设置,uniform 是材质参数,/// 注解写参数的分组和说明,普通的 HLSL 函数是辅助逻辑,export 的那个函数就是材质本身。保存后插件把它编译成标准的材质节点图。

M_TeleportGlow.dssDreamShaderLang 2.0
// M_TeleportGlow.dss#pragma material(ShadingModel = Unlit, BlendMode = Additive)/// @group Glow|Look   @desc Multiplied on top of the particle colouruniform float4 Tint = float4(1, 1, 1, 1);/// @group Glow|Look   @desc Overall emissive gainuniform float Intensity = 0.7;float GlowMask(float2 UV){    float2 P = UV * 2.0 - 1.0;    return pow(saturate(1.0 - dot(P, P)), 2.4);}export void M_TeleportGlow(inout material m){    float2 UV = UE.TexCoord(Index = 0);    m.EmissiveColor = Tint.rgb * GlowMask(UV) * Intensity;}

编译成材质 M_TeleportGlow,Unlit、Additive,带 Tint 和 Intensity 两个参数

dsc compile M_TeleportGlow.dss

工作流

从源文件到材质资产

源文件说明要什么,插件负责把它变成资产,并且一直让两者保持一致。保存即编译,生成过程是幂等的。

  1. Author

    用 .dss(2.0)或 .dsm / .dsf(1.x)写材质和材质函数,#include 共享的头文件,用 Package 引入别人写好的库;VS Code 扩展负责补全、悬停和诊断。

  2. Compile

    保存即编译:解析、绑定、降成中间表示,再生成材质表达式。每条诊断都带 DSHnnnn 码,指回你实际写的那一行。

  3. Asset

    生成 UMaterial、UMaterialFunction、材质层与层混合、材质实例(.dsi),以及 UE 5.8 上的 Custom Pass 管线(.dsp)。

  4. Rebuild

    每个资产都记着它是从什么构建的:源文件、插件版本或设置一变就重建;被手改过的资产会被认出来,可以还原成源文件的样子,也可以把改动收回源文件。