Diagnostics
Where DreamShader reports errors, how to read a message, and a lookup table of the ones you will actually hit — grouped by pipeline stage.
Every compile failure surfaces as a diagnostic: one message, owned by one source file, usually carrying a line and column. This page explains where those messages appear, how to read them, and then lists the ones a working project actually runs into, grouped by the stage that produced them.
| Item | Value |
|---|---|
| Produced by | DreamShader (parser, runtime module) and DreamShaderEditor (generator, bridge, tools) |
| Log category | LogDreamShader |
| Severity | every stored diagnostic is error — the store has no warning, info or hint level |
| Bridge artifacts | <Project>/Saved/DreamShader/Bridge/diagnostics.json, .../Bridge/diagnostics/, .../Bridge/bridge.db |
Where diagnostics appear
| Surface | What it shows |
|---|---|
| Output Log | the raw compile message, at Error on failure and Display on success, under LogDreamShader |
| Material Content Browser ▸ Dream Shader Gen page | the per-source-file diagnostic list, read back from diagnostics.json |
Bridge/diagnostics.json | { version, updatedAtUtc, files[] }, one entry per source file |
Bridge/diagnostics/ | one <md5-of-normalized-path>.json shard per file plus index.json; stale shards are deleted on every write |
Bridge/bridge.db | SQLite table diagnostics(path, json, updated_at_utc), replaced wholesale in one transaction |
| VSCode / Rider squiggles | rendered by the extension from the three bridge artifacts above |
The three bridge sinks are written together on every update, so they never disagree. The Output Log is a separate path and is the only surface that also shows success messages.
Diagnostics are owned by the source file that produced them. Recompiling A.dsm clears exactly the
records A.dsm produced — including records attributed to an imported .dsh — without disturbing
another material's diagnostics for the same header.
The bridge never runs inside a commandlet. -run=DreamShader, -run=Cook and any other commandlet
process write no diagnostics.json, no shards and no bridge.db rows; the messages exist only in
the log. The bridge is also suppressed by -NoDreamShaderEditorBridge. See
Commandlet.
One severity
Severity defaults to "error" and is never assigned any other value anywhere in the plugin. Three
consequences are worth knowing:
- Parse warnings — deprecated spellings, the missing-
Outputswarning — never enter the store. They are appended to the compile result message and surface in the Output Log only. - Log-only warnings likewise never enter the store.
- An extension that colours by severity paints every DreamShader entry as an error.
The Gen page tolerates a missing or non-error severity by filtering rather than failing, so a
future severity level would not break it.
Reading a message
When a diagnostic carries a position it is formatted MSVC-style:
I:/Project/DShader/Materials/M_Sample.dsm(37,9): Unknown Graph identifier 'Tin'.| Stage | How the location is obtained |
|---|---|
| Top-level parse | the message ends in near index {Index}; the index is mapped back through the prepared (import-inlined) source to a real file, line and column |
Graph block | the block's recorded start offset plus the statement's block-relative line and column; the column is offset only on the block's first line |
| Material compile | the engine's own <path>(<line>,<col>): prefix, re-parsed and re-attributed |
| Everything else | no position — the message falls back to <file>: <message> at line 1, column 1 |
Line and column numbers reported for parse errors inside a section body are wrong. Section-body
scanners are constructed over the section body substring, so a near index {Index} raised inside a
Properties, Settings, Outputs or Layout body is body-local while the mapper treats it as a
global index into the prepared source. The file is correct; the position is not. Locate the statement
by the text quoted in the message instead.
The {Placeholder} convention
Runtime substitutions are written as {Placeholder} in every table below. A brace run followed by
... — as in Graph = { ... } — is literal message text, not a placeholder.
| Placeholder | Substituted with |
|---|---|
{File} | the normalized absolute path of the .dsm / .dsf / .dsh being compiled |
{Name} | the identifier the author wrote, with its original casing |
{Kind} | ShaderFunction, ShaderLayer or ShaderLayerBlend — the deprecated MaterialLayer / MaterialLayerBlend spellings never appear in a diagnostic |
{Detail} | an inner diagnostic; look it up in its own stage table |
{Index}, {Count}, {Line} | numbers; argument indices are 1-based |
Messages are quoted verbatim below, inconsistent punctuation included. One message really does end without a full stop, and it is marked where it appears.
This page carries the messages you are likely to meet. The exhaustive list — every message the
parser, generator, commandlet and VirtualFunction sync can emit, roughly four times as many rows —
lives in the plugin's own manual at Plugins/DreamShader/Docs/diagnostics/index.md.
Parse
Lexical scanning, top-level block headers, and the import inliner. These run before any section body is examined; a failure here aborts the whole file.
| Message | Cause | Fix |
|---|---|---|
| Unexpected token near index {Index}. | No top-level keyword matched at this position. An import line handed straight to the parser also lands here. | Check keyword spelling and case — top-level keywords are the only case-sensitive tokens in the language. Details |
| Expected '{' near index {Index}. | A block body was expected. | Add the { … } body. Details |
| Expected identifier near index {Index}. | An identifier was expected — an attribute key, a section name or a block name. | Identifiers are [A-Za-z_][A-Za-z0-9_]*. Details |
| Expected ',' or ')' near index {Index}. | A malformed header attribute list. | Separate attributes with a comma; a trailing comma before ) is allowed. Details |
| Unterminated block. | End of file reached before a } closed the block. | Balance the braces. Details |
| Unterminated string literal. | End of file reached inside a quoted attribute value. | Details |
| A top-level Shader, Function, GraphFunction, Namespace, ShaderFunction, ShaderLayer, ShaderLayerBlend, or VirtualFunction block was not found. | The parse unit declared no recognized top-level block. An empty Namespace body also lands here. | Add a top-level block, and check that the keyword's case is exact. Details |
| Shader(Name="...") is required. | The Shader header has no Name attribute. | Add Name="…". Details |
| Only one top-level Shader block is currently supported. | A second Shader keyword in the parse unit — enforced across the whole transitive import closure, not per file. | Split into separate .dsm files. Details |
| Shader must provide a Graph block. | A Shader with an empty Code section and no initialized output declaration. | Add Graph = { … }, or initialize an output declaration. Details |
| DreamShader import '{Specifier}' referenced from '{File}' could not be resolved. | None of the three candidate roots contained the specifier, or a candidate escaped its containment root. | Check the extension — a specifier with no extension implies .dsh — and that the target is under DShader or DShader/Packages. Details |
| DreamShader import cycle detected at '{File}'. | A file re-enters its own import stack. | Break the cycle; diamond imports are fine, cycles are not. Details |
| DreamShader header '{File}' may only declare Function/Namespace/GraphFunction/VirtualFunction blocks and imports. | A .dsh whose text contains Shader(, ShaderFunction(, ShaderLayer(, ShaderLayerBlend(, MaterialLayer( or MaterialLayerBlend( anywhere — comments and string literals included. | Move the block to a .dsf or .dsm, or reword the comment. Details |
| DreamShader function file '{File}' may only declare imports, Function/Namespace/GraphFunction/VirtualFunction blocks, and ShaderFunction/ShaderLayer/ShaderLayerBlend blocks. | A .dsf whose text contains the substring Shader( anywhere. | Move the Shader block to a .dsm, or reword the comment. Details |
| Function '{Name}' has an invalid parameter declaration '{Parameter}'. | The parameter did not split into two or three whitespace-separated tokens, or its type or name was empty. | Write [in|out] <Type> <Name>. Details |
| Function '{Name}' must declare at least one out parameter. | No out parameter and no return type. | Add an out parameter, or a return type. Details |
| Function '{Name}' has a return type and cannot also declare out parameters. Use out parameters without a return type for multiple outputs. | A return-typed Function also declared out. | Pick one form. Details |
| Function '{Name}' parameter '{Parameter}' uses unsupported qualifier '{Qualifier}'. Supported qualifiers are in and out. | A qualifier other than in / out — inout included. | Details |
Sections and declarations
Section dispatch, the Outputs grammar, Layout, #Region, Group(…) scopes, and the post-parse
validation of output declarations and bindings.
| Message | Cause | Fix |
|---|---|---|
| Unknown shader section '{Section}'. | A section other than Properties / Settings / Outputs / Graph / Layout / Code. | Check the spelling; Inputs, Results and Options are not accepted in a Shader. Details |
| Unknown material function section '{Section}'. | A section other than Properties / Inputs / Outputs / Results / Settings / Graph / Layout / Code. | Check the spelling; Options is not accepted here. Details |
| Shader graph sections now use Graph = { ... }. Function Code = { ... } is still supported. | A Code section inside a Shader block. | Rename it to Graph. Details |
| Invalid typed declaration '{Statement}'. | The left side does not split into <Type> <Name>, or the name is not an identifier. A tab between the type and the name fails here — this splitter looks for a literal space. | Replace the tab with a space. Details |
| Unsupported output type '{Type}' for '{Name}'. | An Outputs declaration whose type token does not resolve. | Details |
| Unsupported material output '{Name}'. | The name after Base. is not a recognized material property. | Consult the Base.* target catalogue. Details |
| Output binding target '{Target}' must start with Base. for material outputs or Expression(...) for output nodes. | A binding target that is neither form. | Details |
| Output variable '{Name}' is declared as '{Type}' but bound material property '{Property}' expects a different type. | The declared type and the target's type disagree. | Change the declaration to match the target. Details |
| Output variable '{Name}' must declare an explicit type before binding to expression target '{Target}'. | A variable bound to Expression( … ).Pin[i] with no declaration. | Declare the variable in Outputs first. Details |
| Outputs declarations cannot use the reserved name 'return'. | An Outputs declaration named return, ignoring case. | Details |
| The reserved output name 'return' can only bind to Base material properties. | return bound to an Expression( … ).Pin[i] target. | Bind a named variable instead. Details |
| Base.FrontMaterial requires Unreal Engine 5.4 or newer. | Base.FrontMaterial bound on UE 5.3. | Details |
| Output '{Name}' uses Substrate, which requires Unreal Engine 5.4 or newer. | A Substrate-typed output declaration on UE 5.3. | Details |
| Unexpected '{' in Properties near '{Text}'. Only Group("Name") { ... } may open a brace here. | A brace inside Properties that is not a Group("Name") head. | Details |
| Unterminated Group("{Name}") { ... } block. | A Group scope left unclosed. | Details |
| Graph #Region '{Name}' is missing #EndRegion. | A region left open at the end of the Graph body; the innermost open region is reported. | Details |
| Invalid Layout Node statement '{Statement}'. {Detail} | A Node( … ) call failed argument validation. | Supply Var, X and Y. Details |
| Parameter node type '{Type}' is recognized but not supported as a plain Properties declaration yet. Use UE.{Type}(OutputType="float4", ...) for reflected node creation. | A known expression-class token that has no Properties declaration form. | Declare it as a UE.* builtin property instead. Details |
Graph statements and expressions
The statement and expression language inside Graph = { … }, plus constructors, swizzles and
coercion. Parse-stage messages here are usually wrapped in the statement-level prefix
In Graph statement '{Statement}': {Detail}.
| Message | Cause | Fix |
|---|---|---|
| Unknown Graph identifier '{Name}'. | The name is not a variable, a property, an output, or true / false. A bare read of a StaticSwitchParameter also lands here — it must be called. | Check the spelling; Graph variable lookup is case-insensitive, but a typo is still a typo. Details |
| In Graph statement '{Statement}': {Detail} | The statement-level wrapper. {Detail} is the real diagnostic. | Details |
| Failed to declare Graph variable '{Name}'. {Detail} | A declaration with no initializer whose type token could not be resolved — the wrapper around most unsupported-construct failures. | Details |
| Unsupported Graph variable type '{Type}'. | A bare declaration whose type token does not resolve. return x;, for (…) { }, while (…) { }, do { } and switch (…) { } all surface here, because they parse as declarations. | Details |
| Unsupported Graph variable type '{Type}' for '{Name}'. | The same, for a declaration that has an initializer. a += b — written with spaces — surfaces here. | Compound assignment is not supported; write a = a + b. Details |
| Graph expression statements currently support only Function calls with explicit out arguments. | A bare expression statement that is not a call: break;, continue;, return;, a++;, a lone identifier. | Details |
| Graph variable '{Name}' is declared more than once. | A redeclaration. The lookup is case-insensitive, so Tint and tint collide. | Details |
| Graph variable '{Name}' is declared as '{Type}' but assigned an incompatible value. {Detail} | The initializer does not coerce to the declared type. | Details |
| Graph variable '{Name}' was previously assigned an incompatible value. {Detail} | A reassignment whose shape differs from the variable's first value. | Details |
| Graph variable type '{Type}' requires an explicit initializer. | A bare declaration of a texture or Substrate type — only scalars and vectors default-initialize. | Details |
| Graph output variable '{Name}' was assigned an incompatible value. {Detail} | An assignment to an Outputs name that does not coerce to its declared type. | Details |
| Unexpected token '{Token}' in Graph expression. | A non-primary token in primary position, or a real token left over after a complete expression. | Characters the lexer does not know never reach this message — they truncate the expression silently instead. Details |
| Expected token type {Type} in Graph expression near '{Text}'. | A ) or , was required and not found — the usual symptom of an unknown character inside parentheses. | Details |
| Operator '{Op}' requires matching vector sizes or a scalar/vector pair, got {A} and {B} component(s). | Mismatched operand widths. | Swizzle or splat one operand. Details |
| Integer division is not supported by the material graph; use float() or floor(a/b). | int(a) / int(b). | Details |
| Arithmetic operators cannot be applied to texture values. | + - * / applied to a texture object. | Sample the texture first. Details |
| Arithmetic operators cannot be applied to MaterialAttributes values. | + - * / applied to a MaterialAttributes value. | Read a member first. Details |
| Swizzle '{Swizzle}' is invalid for a value with {Count} components. | The swizzle names a channel the value does not have. | Widen the value, or shorten the swizzle. Details |
| Unsupported swizzle '{Swizzle}'. | Characters outside xyzw / rgba, or more than four of them. | Use up to four channels from one set. Details |
| Texture values do not support swizzle/member access in Code. | .rgb applied to a texture object. | Sample the texture first. Details |
| Constructor '{Name}' expects {Expected} total components but got {Actual}. | The argument widths do not add up. | Details |
| Expected {Expected} component(s) but got {Actual}. | A numeric coercion of the wrong width. | Widen, narrow or splat explicitly. Details |
| String literals can only be used in named UE builtin arguments. | A quoted string used as a value. | Details |
| Graph if statement is missing a '{ ... }' body. | No brace after the condition — single-statement bodies are not accepted. | Details |
| Graph if condition left side must evaluate to a scalar value. | A vector on the left of the comparison. | Use a scalar, or a swizzle. Details |
| Unsupported Graph if comparison operator '{Op}'. | An operator outside > < >= <= == !=. | Details |
| Graph if statement could not resolve both branch values for '{Name}'. | A name assigned in only one branch — branch-local declarations leak into the merge. | Assign the name in both branches, or declare it before the if. Details |
| Graph if branches assign variable '{Name}' with inconsistent types | The two branch values differ in kind or width. This message has no trailing full stop. | Details |
| Unknown MaterialAttributes variable '{Name}'. | A member write to an undeclared name. | Details |
| MaterialAttributes values cannot be assigned to numeric outputs. | An attributes value assigned to a numeric target. | Read a member first. Details |
| Texture objects cannot be assigned to numeric outputs. | A texture object assigned to a numeric target. | Sample it first. Details |
Builtins
The UE.* and Substrate.* call surfaces in Graph, the UE.* declaration form in Properties,
the math builtins, and the shared reflected-value writer. {Namespace} is UE or Substrate.
| Message | Cause | Fix |
|---|---|---|
| Unsupported UE builtin call '{Name}' in Graph. For generic MaterialExpression calls, add OutputType="float1/2/3/4/Texture2D/TextureCube/Texture2DArray/VolumeTexture/Substrate". | An unregistered UE.* name with no OutputType / ResultType. | Add OutputType="…". The hint string is incomplete — MaterialAttributes, SamplerState, StaticBool and the half* / vec* / ivec* / uvec* / bvec* / int* / uint* / bool* families are also accepted. Details |
| Unsupported UE builtin function '{Name}'. Use OutputType="float1/2/3/4/Texture2D/TextureCube/Texture2DArray/VolumeTexture" for generic MaterialExpression calls. | The same, for the Properties declaration form. | Add OutputType="…"; note that MaterialAttributes is not accepted by the declaration form. Details |
| UE.Expression requires Class="MaterialExpressionName". | UE.Expression( … ) with no Class. | Add Class, or call UE.<ClassName>( … ) and let Class default to the function name. Details |
| UE.{Name} could not resolve MaterialExpression class '{Class}'. | No loaded, non-abstract UMaterialExpression subclass matched any candidate spelling. | Resolution compares the reflected class name, which carries no U prefix. Write Sine, MaterialExpressionSine or /Script/Engine.MaterialExpressionSine — a U-prefixed spelling never resolves. Details |
| UE.{Name} OutputType '{Type}' is not supported. | The token does not resolve to a declared type. | Details |
| UE.{Name}: '{Argument}' is not a property on '{Class}'. | An argument that matched neither an input pin nor a reflected property, on a non-Custom node. | Check the name against the node's pins and UPROPERTYs. Details |
| UE.{Name} input '{Input}': {Detail} | An argument sub-expression failed to evaluate. | Details |
| UE.{Name} output '{Output}' was not found on '{Class}'. | Output= / OutputName= matched no output. Unnamed outputs also accept the mask pseudo-names R, G, B, A, RG, RGB and RGBA. | Details |
| UE.{Name} OutputIndex is out of range for '{Class}'. | OutputIndex is negative, or beyond the node's output count. | Details |
| Generic {Namespace}.{Name} calls require named arguments. | A positional argument on the generic UE.* / Substrate.* path. | Use Key=Value for every argument. Details |
| '{Value}' is not a valid enum value for '{Property}'. | None of the four accepted enum spellings matched. | Try the short name, the full name, the display name, or the short name with its prefix removed. Details |
| '{Value}' is not a valid boolean value for '{Property}'. | A reflected bool property was written with a non-boolean. | Use true or false. Details |
| Property '{Property}' on '{Class}' is not a supported literal type yet. | A struct or array property whose text failed Unreal's own import. | Use Unreal's literal syntax, for example (R=1,G=0,B=0,A=1). Details |
| UE builtin property '{Name}' does not support inline defaults. Put arguments inside UE.{Function}(...). | A declaration of the form UE.X Name = value;. | Move the value into the argument list. Details |
| UE.SceneTexture expects exactly Id="..." (e.g. Id="PostProcessInput0"). | UE.SceneTexture called with anything other than a single Id= argument. | Details |
| This builtin is not implemented by the material generator yet. For generic MaterialExpression support, add OutputType="float1/2/3/4/Texture2D/TextureCube/Texture2DArray/VolumeTexture". | A property-form UE.* name the parser accepts but the generator has no implementation for — UE.VertexNormalWS and UE.VertexTangentWS are the two live cases. | Add OutputType="…" to route through the generic path, e.g. UE.VertexNormalWS(OutputType="float3"). Details |
| SampleTexture2D expects exactly two positional arguments: (textureObject, uv). | Wrong argument count. The name is matched case-sensitively. | Write SampleTexture2D(Tex, UV). Details |
| Math function '{Name}' expects exactly 1 argument. | Wrong arity for a unary builtin — or a named argument, which reports as an arity error. | Pass exactly one positional argument. The 2- and 3-argument variants read identically. Details |
| Math function '{Name}' only accepts numeric scalar/vector arguments. | A texture, MaterialAttributes or Substrate argument. | Details |
| Substrate builtin call '{Name}' requires Unreal Engine 5.4 or newer. | Any Substrate.* call on UE 5.3. | Details |
| Unsupported Substrate builtin call '{Name}' in Graph. | The name is not in the Substrate.* table. | Details |
| {Namespace}.{Name} input '{Input}' does not accept MaterialAttributes values. | An attributes value fed to a numeric pin. | Read a member first. Details |
Functions and calls
Calling Function, GraphFunction, ShaderFunction, ShaderLayer, ShaderLayerBlend and
VirtualFunction from Graph, and the generated HLSL helper include. {Kind} is the call kind.
| Message | Cause | Fix |
|---|---|---|
| Unknown Graph function '{Name}'. | The callee is not a declared Function. A misspelled builtin also lands here, after falling through every other resolution step. | Check the spelling and the import. Details |
| Graph call '{Name}' is ambiguous because multiple definitions use that name: {Names}. | One name declared by more than one callable. | Rename, or qualify with a namespace. Details |
| DreamShader Function '{Name}' expects {Total} arguments ({Inputs} inputs, {Outs} out targets) but got {Actual}. | Wrong argument count in statement form. | Pass every input, followed by every out target. Details |
| DreamShader Function '{Name}' has {Count} outputs and must be called with explicit out variables, for example {Name}(..., ResultA, ResultB). | A multi-output Function used as a value expression. | Use statement form with out targets. Only single-output functions are value-callable. Details |
| DreamShader Function '{Name}' returns one value and expects {Expected} input argument(s) when used as a value expression, but got {Actual}. | Wrong argument count in value form. | Details |
| DreamShader Function '{Name}' currently uses positional arguments only. | A named argument in a Function call. | Details |
| DreamShader Function '{Name}' input '{Input}' uses Substrate, which is not supported by HLSL Custom node functions. Use GraphFunction or ShaderFunction instead. | A Substrate input on an HLSL Function. | Details |
| SelfContained Function cycle detected: {Chain}. HLSL Custom nodes cannot compile recursive DreamShader functions. | Recursion among SelfContained / Inline functions. | Details |
| GraphFunction cycle detected: {Chain}. | A GraphFunction calls itself, directly or transitively. | Details |
| DreamShader GraphFunction '{Name}' result '{Result}' was never assigned. | The body never wrote the result. | Details |
| {Kind} '{Name}' is missing required input '{Input}'. | A non-opt input was not supplied. | Supply it, or mark the input opt. Details |
| {Kind} '{Name}' does not have an input named '{Input}'. | A named argument matched no declared input. | Details |
| {Kind} '{Name}' input arguments cannot mix positional and named forms. | Some arguments named, some positional. | Pick one form. Details |
| {Kind} '{Name}' exposes multiple outputs. Specify Output="Name" or OutputIndex=N. | A value-form call to a multi-output asset. | Details |
| {Kind} '{Name}' could not load MaterialFunction asset '{Path}'. | The referenced asset is missing. | Details |
Properties and parameters
Properties declarations, the [ … ] metadata block, parameter-node construction, Path( … ) asset
references, and parameter reads from Graph.
| Message | Cause | Fix |
|---|---|---|
| Unsupported property type '{Type}'. | The type token matched no compact type, no parameter-node token and no UE. prefix. | Check the token against the type catalogue. Details |
| Invalid property declaration '{Statement}'. | No top-level whitespace separating the type from the name. | Details |
| {File}: Property '{Name}' is declared more than once. Property names must be unique. | Two Properties entries whose names are equal ignoring case. | Details |
| Invalid scalar default value '{Value}' for property '{Name}'. | The default did not parse as a number, true or false. | Details |
| Invalid vector default value '{Value}' for property '{Name}'. | The default did not parse as a 1–4 component literal. | Use float3(…), vec3(…) or ( … ). Details |
| Texture property '{Name}' could not load asset '{Path}'. | The explicit default failed to load. | Details |
| Texture property '{Name}' with type Texture2DArray requires an explicit default asset. | No engine default exists for Texture2DArray. | Supply = Path( … ). Details |
| {Context} texture property '{Name}' expects {Expected} but '{Path}' is a '{Class}'. | The assigned texture's dimension does not match the declared type. {Context} is Const or Texture. | Assign a texture of the right dimension, or use TextureObjectParameter, which takes its dimension from the asset. Details |
| Texture defaults must use Path(Game|Engine|Plugin.PluginName, "/Folder/Asset"), Path("/Game/Folder/Asset"), or a bare "/Game/Folder/Asset". | The default is not one of the three accepted forms. | Details |
| Asset Path(...) expects either 1 argument (/Game/... path) or 2 arguments (Game|Engine|Plugin.PluginName, asset path). | Wrong argument count in Path( … ). | Details |
| Unsupported asset Path root '{Root}'. Use Game, Engine, or Plugin.PluginName. | An unrecognized root in a metadata or collection reference. | Details |
| Metadata entry '{Entry}' must use Key=Value syntax. | A metadata entry with no top-level =, other than Slider( … ). | Details |
| Metadata key '{Key}' is declared more than once. | A duplicate key after normalization; the message echoes the original spelling. | Details |
| Metadata property '{Property}' is not a reflected property on '{Class}'. | An unrecognized metadata key that is not one of the three soft-failing organization fields. | Remove it, or use a real UPROPERTY name. Details |
| Metadata 'Slider(min, max)' requires exactly two numeric bounds: '{Entry}'. | Wrong arity, or non-numeric bounds. | Write Slider(0, 1). Details |
| Parameter '{Name}' ({Type}) has no input pin named '{Pin}'. Asset slots (Texture/Curve/Font/...) are set via [{Pin}=Path(...)] metadata, not call arguments. | A call-form argument that matches no engine pin. TextureObject on a texture-sample parameter is the common case. | Set asset slots through metadata; use a real pin name for wiring. Details |
| Parameter '{Name}' must be called with named arguments wiring its input pins (e.g. {Name}(Coordinates=...) or {Name}(Input=...)). | A positional argument in the parameter call form. | Details |
| StaticSwitchParameter '{Name}' requires True=... and False=... inputs. | One or both branches missing. A= / B= and positional 0 / 1 are accepted aliases. | Details |
Settings
The Settings section of a Shader — the special keys plus the reflected UMaterial property path
— and the four keys a material-function Settings honours. {Key} echoes the lower-cased stored
key, not the spelling that was typed.
| Message | Cause | Fix |
|---|---|---|
| Unsupported material setting '{Key}'. | No FProperty on UMaterial matched the key by alias, normalized name, b-prefix strip, or DisplayName. | Check the property name in the material's details panel. Details |
| Invalid setting declaration '{Statement}'. | The statement has no top-level =. | Write Key = Value;. Details |
| Invalid value '{Value}' for setting '{Key}'. {Detail} | The reflected write failed; {Detail} is the value-writer message from the Builtins table. | Details |
| Invalid boolean value '{Value}' for {Key}. | A setting the generator reads as a boolean was given text that is neither true nor false, matched case-insensitively. | Details |
| Unsupported ShadingModel '{Value}'. | The value matched no EMaterialShadingModel name, alias or project mapping. | Details |
| Unsupported BlendMode/RenderType '{Value}'. | The value matched no EBlendMode name, alias or project mapping. | Details |
| Unsupported MaterialDomain '{Value}'. | The value matched no EMaterialDomain name, alias or project mapping. | Details |
| Unsupported Backend '{Value}'. Supported values: Graph, Instance, ThinCustom. | An unrecognized Backend value. | Use Graph or ThinCustom; Instance is a deprecated alias for ThinCustom. Details |
| ShadingModel="Substrate" requires Unreal Engine 5.4 or newer. | Substrate or Strata on UE 5.3. | Details |
| {File}: Base.FrontMaterial and Base.MaterialAttributes cannot be used by the same Shader. | Both bindings present. | Details |
| {Kind} '{Name}': ExposeToLibrary must be true or false. | A non-boolean ExposeToLibrary in a material-function Settings block. | Details |
Asset generation and saving
Pipeline gates, asset naming and root resolution, node-graph population, the ownership guard, and package saving.
| Message | Cause | Fix |
|---|---|---|
| {File}: Outputs block is required. | The Shader declared no output bindings. | Add at least one Base.<Property> = …; binding. Details |
| {File}: This file does not define a top-level Shader block. | Material generation was requested for a file with no Shader. | Details |
| Asset '{ObjectPath}' already exists and was not generated by DreamShader. Rename your shader or move/delete the existing asset before regenerating. | The ownership guard: the saved material carries no DreamShader.SourceFile metadata. | Rename the Shader, or delete the asset. Details |
| Asset '{ObjectPath}' already exists and was not generated by DreamShader. Rename your function or move/delete the existing asset before regenerating. | The same guard, for a function asset. | Details |
| Asset '{ObjectPath}' already exists and is not a Material. | Graph backend; the target path holds another UClass. | Details |
| Asset '{ObjectPath}' already exists and is not a DreamShader instance material. Delete it (or remove Backend="Instance") before switching backends. | ThinCustom backend; the target path holds another UClass. | Details |
| Asset '{ObjectPath}' already exists as '{Actual}', but {Kind} generation requires '{Expected}'. Delete or move the existing asset and regenerate it. | The block kind changed — ShaderFunction to ShaderLayer, for example. | Delete the old asset and regenerate. Details |
| DreamShader Root '{Root}' must reference a project plugin under '{Dir}'. | The plugin is an engine or marketplace plugin, not a project plugin. | Details |
| Generated DreamShader asset '{ObjectPath}' could not be saved. | Saving failed for a single asset. | Check source control and file permissions. Details |
| DreamShader header '{File}' does not generate assets directly. Recompile dependent .dsm or .dsf files instead. | Asset generation was requested for a .dsh. | Details |
| {File}: Graph output '{Name}' does not match its declared type. | The value assigned in Graph has the wrong shape. | Details |
| {Kind} '{Name}' output '{Output}' was never assigned an expression. | The Graph body never assigned the output. | Details |
| ShaderLayer '{Name}' must declare at most one input, and it must be MaterialAttributes. Use Properties for layer controls. | A layer with extra or wrongly typed inputs. | Details |
| ShaderLayerBlend '{Name}' must declare exactly two inputs, both MaterialAttributes. Use Properties for blend controls. | A blend with the wrong input shape. | Details |
| {Kind} '{Name}' must declare exactly one MaterialAttributes output. | A ShaderLayer / ShaderLayerBlend with the wrong output shape. | Details |
| {File}: Material output '{Name}' expects a MaterialAttributes value. | A numeric value bound to Base.MaterialAttributes. | Details |
| {File}: Material output '{Name}' expects a Substrate value and cannot be driven by a material Custom node. Use a Graph block and Substrate.* nodes. | The ThinCustom / HLSL path cannot produce a Substrate value. | Set Backend = "Graph". Details |
Commandlet
-run=DreamShader and the cook-time generation hook. None of these reach the diagnostics store — the
bridge does not run in a commandlet process.
| Message | Cause | Fix |
|---|---|---|
| DreamShader compile requires a .dsm or .dsf file: {File} | The file is not a DreamShader source, or is a .dsh header. The run continues but is marked failed. | Details |
| Unknown DreamShader command '{Command}'. | The first bare token is not compile, generate, decompile or export. A stray bare token in first position is consumed as the command name. The usage banner follows. | Details |
| DreamShader could not load asset '{Path}'. | Loading failed for both the normalized and the raw path. | Check the object path; /Game/Path/Asset is auto-expanded to /Game/Path/Asset.Asset. Details |
| DreamShader decompile supports Material and MaterialFunction assets only: {Path} | The asset is neither a UMaterial nor a UMaterialFunction family asset. | Details |
| DreamShader cook generation failed for {Count} source file(s); aborting the cook. See the [Cook] Failed entries above. | One or more sources failed during cook-time generation. Logged at Fatal, which aborts the cook. | Compile every source cleanly in the editor, or run the commandlet, before cooking. Details |
VirtualFunction sync
The startup service that re-reads every VirtualFunction declaration and refreshes it from its
UMaterialFunction asset. These reach the store with stage = virtualFunctionSync.
| Message | Cause | Fix |
|---|---|---|
| VirtualFunction '{Name}' references missing MaterialFunction '{Path}'. | The asset failed to load. | Restore the asset, or update Options.Asset. Details |
| VirtualFunction '{Name}' could not be refreshed from MaterialFunction '{Path}': {Detail} | The declaration builder failed. | Details |
| DreamShader could not read VirtualFunction source file '{File}'. | The source file is unreadable; reported at line 1, column 1. | Check file locks and permissions. Details |
| {Kind} '{Name}' input '{Input}' does not exist on MaterialFunction asset '{Path}'. | The declared input is absent from the asset — usually because the asset changed after the declaration was written. | Re-sync the declaration. Details |
Warnings
Warnings never fail a compile and never enter the diagnostics store. They are appended to the compile
result message, or logged under LogDreamShader.
| Message | Deprecated construct | Replacement | Deprecated in |
|---|---|---|---|
MaterialLayer is deprecated; use ShaderLayer instead. | MaterialLayer( … ) { … } | ShaderLayer( … ) { … } | 1.3.0 |
MaterialLayerBlend is deprecated; use ShaderLayerBlend instead. | MaterialLayerBlend( … ) { … } | ShaderLayerBlend( … ) { … } | 1.3.0 |
These are the only two deprecations that warn. Every other deprecated or aliased spelling is
accepted in silence: Backend = "Instance", the project-level Default Compiler Backend = Instance,
Results = { … } in place of Outputs, and Properties / Settings in place of Inputs /
Options inside a VirtualFunction. Nothing tells you they are legacy.
Other warnings worth recognizing:
| Message | Meaning |
|---|---|
No Outputs block was provided. Generation requires explicit material property bindings. | the parse succeeds; generation then fails with {File}: Outputs block is required. |
'{Class}' does not expose the '{Field}' organization field; ignoring it for this parameter. | Group, SortPriority or Desc metadata written to a node class that has no such property. Only these three fields soft-fail — any other missing key is an error |
In-memory material mode: '{ObjectPath}' already exists as a saved asset, which shadows in-memory regeneration. Delete the saved asset to make it fully in-memory. | a saved .uasset at the target path takes precedence over the in-memory material |
Skipping automatic layout for large DreamShader graph ({Count} nodes). Existing generated positions will be used. | logged at Display; auto-layout was skipped |
Failed to open DreamShader bridge database for diagnostics: {Detail} | bridge.db could not be opened; the JSON sinks are still written |
DreamShader commandlet found no source files to compile. | compile -All resolved an empty list. The commandlet still exits 0 |
When nothing is reported
Some mistakes produce no message at all. The largest class by far is expression truncation: the
Graph tokenizer turns every character it does not know — %, &, |, ^, <, >, ?, [,
! and the rest — into an end-of-expression token, and the parser accepts the expression that
precedes it. a % b compiles as a, and if (x > 0 && y > 0) compiles as if (x > 0).
What Graph Is Not covers that page-length. A shorter list of the other silent cases lives on Limitations.
Success messages
The same pipeline returns these on success — useful when scripting a compile and matching on output.
| Message | Meaning |
|---|---|
Generated {ObjectPath} from {File}.{Suffix} | Graph backend succeeded; {Suffix} is (virtual) for an in-memory material |
Generated DreamShader thin-custom material {ObjectPath} from {File}. | ThinCustom backend succeeded |
Generated {Kind} {ObjectPath} from {File}. | a material function succeeded |
Generated DreamShader helper include '{Path}' from {File}. | the generated .ush was written |
Skipped {ObjectPath} from {File}; source hash is unchanged. | the source-hash cache short-circuited; pass -Force to override |
DreamShader file '{File}' contains GraphFunction declarations only; no assets were generated. | success; only a helper include was produced |
DreamShader file '{File}' contains VirtualFunction declarations only; no assets were generated. | success; the file only declares existing assets |
One error, four surfaces
// DShader/Materials/M_Sample.dsm
Shader(Name="Materials/M_Sample")
{
Properties = { vec3 Tint = vec3(1.0, 0.4, 0.1); }
Outputs = { vec3 Color; Base.EmissiveColor = Color; }
Graph = {
vec2 UV = UE.TexCoord(Index = 0);
Color = Tin * UV.x; // typo: Tin, not Tint
}
}Output Log:
LogDreamShader: Error: I:/Project/DShader/Materials/M_Sample.dsm(8,19): Unknown Graph identifier 'Tin'.Saved/DreamShader/Bridge/diagnostics.json:
{
"version": 1,
"updatedAtUtc": "2026-07-29T11:04:22Z",
"files": [
{
"path": "I:/Project/DShader/Materials/M_Sample.dsm",
"diagnostics": [
{
"message": "Unknown Graph identifier 'Tin'.",
"detail": "I:/Project/DShader/Materials/M_Sample.dsm(8,19): Unknown Graph identifier 'Tin'.",
"stage": "generate",
"code": "generate-error",
"line": 8,
"column": 19,
"severity": "error",
"source": "DreamShader Generate"
}
]
}
]
}The same record goes to Bridge/diagnostics/<md5>.json and to the diagnostics table of
Bridge/bridge.db, and shows up in the Dream Shader Gen page's source list — which is what the
VSCode and Rider extensions read to draw the squiggle.
Fixing in order
When a file produces a wall of messages, work top-down. Later stages run on the output of earlier ones, so a single parse error can invent a dozen downstream complaints.
Parse first. Balance braces, quotes and parentheses, and check keyword casing. Nothing after this stage runs until the file parses.
Then imports and unknown names. could not be resolved, Unknown Graph identifier and
Unknown Graph function are usually one missing import or one typo.
Then types and signatures. Component-count mismatches, Expected {Expected} component(s), and the
call-arity messages.
Then generation. Ownership guards, asset paths and save failures — these mean the source is valid and the target is not.
Last, Unreal's own material compile. Those messages carry the engine's <path>(<line>,<col>)
prefix and are re-attributed to your source file. They are the only ones DreamShader did not produce.
Where to next
Limitations
What DreamShaderLang does not do yet, including the silent-failure classes.
What Graph Is Not
Truncation, compound assignment, loops — the constructs with no message.
The Pipeline
The stages these tables are grouped by.
Editor Tools
The Material Content Browser tab that renders the source list.
Commandlet
Headless compiles, and why they write no bridge artifacts.
Lexical Elements
The case-sensitivity rules behind several not-found errors.
Packages
DShader/Packages — the install root the plugin implements, the manifest and lock file the extensions implement, and the enumeration gap between them.
Limitations
What DreamShaderLang 1.5.0 does not do yet — the Graph language's boundaries, the silent failures, the decompiler's round-trip gaps, and the function-level ceiling on material layers.