DreamShaderLang
插件参考Diagnostics

DSH1xxx --- 驱动、源文件和导入

DSH1xxx --- 驱动、源文件和导入

DSH1xxx --- 驱动、源文件和导入

生成标记之间的块由 .skill/gen-diagnostics.ps1 写入。 标记下方的一切均为手动编写,会在重新生成后保留。

DSH1030

严重级别 错误

消息

{0}({1}): this '#if' is never closed; the file ends with {2} conditional block(s) still open.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1305

原因。 一个 #if / #ifdef / #ifndef 链已打开,但文件在其 #endif 之前结束;计数表示还有多少个链仍处于打开状态。Function 或 GraphFunction 主体内的指令不计入 -- 它们属于 HLSL 编译器 -- 因此无法从主体内部关闭链

修复。 在条件区域应结束的位置添加缺失的 #endif;如果 #if 是给着色器编译器用的,请将整个链移到函数体内

参见 预处理器

DSH1031

严重级别 错误

消息

{0}({1}): '#endif' without a matching '#if'.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1205

原因。 在没有打开任何 DreamShader 链时发现了 #endif。通常的原因是某个 #if 位于 Function 主体内(对此预处理器不透明),而其 #endif 位于右花括号之后

修复。 删除多余的 #endif,或将 #if 移出主体,使两端位于花括号的同一侧

参见 预处理器

DSH1032

严重级别 错误

消息

{0}({1}): '#{2}' without a matching '#if'.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1129

原因。 在没有打开任何 #if 链时出现了 #elif 或 #else

修复。 先用 #if / #ifdef / #ifndef 打开链,或移除该分支

参见 预处理器

DSH1033

严重级别 错误

消息

{0}({1}): '#{2}' after the '#else' on line {3}, which already closed this chain.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1144

原因。 链已在所示行上取用了其 #else,而 #else 会关闭链:其后只能跟随 #endif

修复。 将额外的分支移到 #else 之上,或用 #endif 关闭链并开始一个新的链

参见 预处理器

DSH1034

严重级别 错误

消息

{0}({1}): invalid '{2}' condition: {3}

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessorExpression.cpp:57

原因。 条件文本在表达式完成之前就结束了 -- 未闭合的括号、悬空运算符(#if 1 &&),或缺少操作数的运算符;冒号后的详细信息是表达式解析器自身的说明

修复。 补全表达式。条件支持 defined(NAME)、!、&&、||、比较、+ - * / %、括号和字符串相等;未定义的名称为 0

参见 预处理器

DSH1035

严重级别 错误

消息

{0}({1}): unknown preprocessor directive '#{2}'. {3}

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1012

原因。 函数体之外的 # 行未拼写出八个指令之一(#if #ifdef #ifndef #elif #else #endif #define #undef)或直通对 #Region / #EndRegion。指令区分大小写,因此 #IF 也会落到此处,而 #include 不在其中(导入应拼写为 import)。这是错误而非警告,因为被静默跳过的指令 -- 例如 #endfi 这样的拼写错误 -- 会使其下方每一行都无条件编译

修复。 修正拼写或大小写;包含请写 import "...";;如果该行是 HLSL 指令,它必须位于 Function 主体内,此预处理器不会查看那里

参见 预处理器

DSH1036

严重级别 错误

消息

{0}({1}): '#{2}' requires a define name.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1074、Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessorExpression.cpp:67

原因。 #ifdef、#ifndef、#define 或 #undef 后没有任何内容

修复。 为该指令提供一个定义名称

参见 预处理器

DSH1037

严重级别 错误

消息

{0}({1}): '#{2}' nesting is deeper than the limit of {3}.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1027

原因。 条件链的嵌套深度超过了所示的固定限制

修复。 展平嵌套:用 && 将内部测试合并为一个条件,或拆分文件

参见 预处理器

DSH1038

严重级别 错误

消息

{0}({1}): '#{2}' needs a name made of letters, digits and underscores and not starting with a digit; got '{3}'.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1083、Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1241

原因。 指令后的名称不是标识符:它必须由字母、数字和下划线组成,且不能以数字开头

修复。 将定义重命名以符合 [A-Za-z_][A-Za-z0-9_]*

参见 预处理器

DSH1039

严重级别 错误

消息

{0}({1}): '{3}' is a read-only built-in constant, so '#{2}' cannot change it. The 'DS_' prefix is reserved by DreamShader.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessor.cpp:1255

原因。 DS_ 前缀保留用于关于编译过程的只读内置事实(DS_ENGINE_MAJOR、DS_ENGINE_MINOR、DS_ENGINE_PATCH、DS_SUBSTRATE、DS_PLATFORM、DS_PLUGIN_VERSION、...)。它们无法从源文件中定义或取消定义,并且保留是按前缀进行的,这样以后添加的内置项永远不会败给项目先注册的名称

修复。 使用不带 DS_ 前缀的名称。要尝试假设的引擎或平台,请定义你自己的开关(在项目设置中或使用 dsc -Define)并据此分支

参见 预处理器

DSH1040

严重级别 错误

消息

{0}({1}): type mismatch in '{2}' condition: {3}

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessorExpression.cpp:76

原因。 运算符两侧的类型不同:解析为整数的值是数字,其他任何内容都是字符串,而两者只在 == / != 中相遇。对字符串进行算术或排序,或将字符串与数字比较,都会引发此错误

修复。 同类比较:为定义提供数值,或仅使用 == / != 比较两个字符串

参见 预处理器

DSH1041

严重级别 错误

消息

{0}({1}): the right operand of '{2}' in this '{3}' condition is zero.

引发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessorExpression.cpp:86

原因。 / 或 % 的除数求值为零。请记住,未定义的名称为 0,因此 #if TOTAL / COUNT 搭配从未定义的 COUNT 是常见的情形

修复。 定义该名称,或用 defined(COUNT) && COUNT != 0 && ... 保护表达式 -- && 会短路,因此除法永远不会被求值

参见 预处理器

DSH1042

严重级别 错误

消息

{0}({1}): '{2}' is already complete before '{3}'. Nothing may follow a directive but a '//' comment.

触发者 Source/DreamShaderLang/Private/Preprocessor/DreamShaderPreprocessorExpression.cpp:1097

**原因。**该指令已经完整,其后又出现了更多词元(#if 1 2、#ifdef A B、#endif LABEL)。指令之后只能跟随一个 // 注释;未完成的表达式属于 DSH1034。#define 是例外,因为它的值一直延伸到行尾

**修复。**删除多余的词元,或将它们转换为 // 注释

参见预处理器

DSH1043

严重性 错误

消息

Asset reference is written as '{0}', which is not a texture class; a texture default requires {1}.

触发者 Source/DreamShaderCompiler/Private/Pipeline/DreamShaderLegacyTextureDefaults.cpp:86

**原因。**某项纹理默认值被写成了一个 Class'/Game/Folder/Asset.Asset' 引用,而该引用的类属于 DreamShader 已知不是纹理的那些 -- MaterialFunction、CurveLinearColor、Font、MaterialParameterCollection 等。从错误的 Content Browser 行复制引用恰好会导致这种情况:路径格式正确、资产存在,但它根本不是纹理槽位能容纳的内容。只有 DreamShader 那份简短的“确定不是纹理”列表中的类才会触发此错误;插件从未听说过的类会被剥离并遗忘,而不会被拒绝

**修复。**从纹理资产本身重新复制引用,或者删除 Class' 前缀以及引号,只保留裸对象路径 -- 引号前的类只是装饰,Unreal 在解析路径时会将其忽略,因此移除它总是安全的

参见路径

DSH1044

严重性 错误

消息

Asset reference is written as '{0}', but this property is declared as {1}.

触发者 Source/DreamShaderCompiler/Private/Pipeline/DreamShaderLegacyTextureDefaults.cpp:75

**原因。**某项纹理默认值被写成了一个 Class'/Game/Folder/Asset.Asset' 引用,而该引用的类是维度与属性声明不同的纹理 -- 例如将 Texture2D'...' 赋给了 VolumeTexture 或 TextureSampleParameterVolume。仅当声明的类型本身指明了其维度时才会运行此检查;TextureObjectParameter 及其同类自身不携带维度,因此不会按这种方式进行判断

**修复。**如果属性类型正确,则从该维度的资产复制引用;如果资产正确,则更改声明的类型以与其匹配。DreamShader 所认为的维度来自声明,而绝非来自粘贴的前缀

参见路径

DSH1045

严重性 错误

消息

Asset reference is written as '%s', but this slot requires a '%s'.

触发者 Source/DreamShaderCompiler/Private/Assets/DreamShaderAssetReferenceResolution.cpp:292、Source/DreamShaderCompiler/Private/Assets/DreamShaderAssetReferenceResolution.cpp:301

**原因。**元数据条目、UE.CollectionParam 参数或 VirtualFunction 的 Options.Asset 中的资产引用被写成了一个 Class'/Game/Folder/Asset.Asset' 引用,而该引用的类与该槽位声明的类无关 -- 例如将 Texture2D'...' 写入 Curve 条目。这两个类会进行双向比较,因此在需要子类的位置写入基类(将 Texture'...' 写入 UTexture2D 属性)会被接受,并留待加载时判定

**修复。**从该槽位所需类的资产复制引用,或去掉 Class' 前缀和引号,只保留裸对象路径

参见路径

本页目录