DreamShaderLang
Diagnostics

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.

ItemValue
Produced byDreamShader (parser, runtime module) and DreamShaderEditor (generator, bridge, tools)
Log categoryLogDreamShader
Severityevery 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

SurfaceWhat it shows
Output Logthe raw compile message, at Error on failure and Display on success, under LogDreamShader
Material Content Browser ▸ Dream Shader Gen pagethe 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.dbSQLite table diagnostics(path, json, updated_at_utc), replaced wholesale in one transaction
VSCode / Rider squigglesrendered 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-Outputs warning — 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'.
StageHow the location is obtained
Top-level parsethe 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 blockthe 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 compilethe engine's own <path>(<line>,<col>): prefix, re-parsed and re-attributed
Everything elseno 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.

PlaceholderSubstituted 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.

MessageCauseFix
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.

MessageCauseFix
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}.

MessageCauseFix
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 typesThe 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.

MessageCauseFix
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.

MessageCauseFix
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.

MessageCauseFix
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.

MessageCauseFix
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.

MessageCauseFix
{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.

MessageCauseFix
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.

MessageCauseFix
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.

MessageDeprecated constructReplacementDeprecated 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:

MessageMeaning
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.

MessageMeaning
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

On this page