DreamShader Plugin
Release notes for the DreamShader Unreal plugin, newest first, taken from the plugin's own CHANGELOG.
Release notes for the Unreal plugin, newest first. Entries record what changes for you — the language surface, the generator, the editor tooling and engine compatibility.
| Current release | 1.5.0 — 2026-08-02 |
| Engines | Unreal Engine 5.3 through 5.8, Win64 |
| Source of record | the plugin's own CHANGELOG.md, shipped in the plugin folder |
1.5.0 - 2026-08-02
The release that unifies compilation. The two old backends collapse into one ThinCustom path,
generated materials become memory-only in the editor, and a new Material Content Browser tab is
where you look at them. The language picks up optional section =, Group() scopes and
Slider().
Language (DreamShaderLang 1.5)
- Section
=is now optional: writeProperties { … },Settings { … }andGraph { … }without the assignment. Both spellings stay valid — see Sections. Properties Group("Name") { … }scopes a group onto every parameter it contains. Groups nest and compose, soGroup("Outer") { Group("Inner") { … } }yieldsOuter|Inner— see Metadata and Groups.Slider(min, max)shorthand sets a scalar parameter's UI range. It expands to the reflectedSliderMin/SliderMaxproperties and is the one metadata entry written without an=.- Asset paths can follow
=directly, and bare quoted paths are accepted — see Asset References. - Single-output functions can be used as return values (
x = Fn(…)), andGraphbuiltins now match theFunctionpath:fract,modandfmod— see Math Builtins. - Live preview streaming keeps the editor and language-server previews in sync while you type.
true/falseare graph literals and materialize asStaticBoolnodes, so anopt StaticBool X = falseinput default generates the Preview-pin node Unreal requires — it ignoresPreviewValuefor static-bool inputs.StaticBoolresolves as a one-component type at call sites.- Texture parameter types whose token carries no dimension —
TextureObjectParameter— take their dimension from the assigned default asset, so aTexture2DArray,TextureCubeorVolumeTexturedefault is accepted. Explicit tokens such asTexture2DandTexture2DArraystill validate strictly.
Backend — one unified compilation path
- The
Graphand the experimentalInstancebackends are collapsed into a single ThinCustom path: DreamShaderLang compiles to a real node graph on a hidden baseUMaterial, wrapped by a thinUDreamShaderMaterialInstance. The engine compiles and enumerates the material natively, so Substrate, static switches, virtual textures, MaterialAttributes and cook correctness all come from the real graph. See Backend. - Bit-identical SM6 render parity with the previous
Graphbackend, verified across Unlit, textured, and DefaultLit MaterialAttributes cases. - The hidden base is a subobject of the instance — one asset, one package, invisible in the
Content Browser, with no separate
MB_DreamThinBase_*sibling and no cross-package parent import to lose at cook. See In-memory Materials. - A single Default Compiler Backend project setting replaces the old In-Memory toggle. See Project Settings.
Deprecated since 1.5.0
Use ThinCustom instead.
Backend = "Instance" and DefaultBackend = Instance are retained as aliases for
ThinCustom. The legacy graphless instance backend is retired; there is no runtime Instance
backend left. The spelling is kept for one deprecation window so existing sources keep compiling,
and it produces no diagnostic.
Editor — Material Content Browser
- New DreamShader Material Content Browser tab under Tools ▸ DreamShader, with two pages:
Project browses, filters and inspects every material and material instance under
/Game, including the full inheritance chain; Dream Shader Gen lists the sources with live preview, search, filters, compile-all, and load-time error surfacing. See Editor Tools. - Create material instances from any material through a folder picker, and materialize in-memory (preview-only) materials to disk on demand.
- Content Browser context-menu actions, and a toggle to show or hide DreamShader's memory-only materials.
Decompiler
- Faithful round-trip for Substrate materials and renamed graph channels. The exporter derives channel swizzles from the write mask rather than the channel name, so recompiled materials match the source bit-for-bit. See Decompiler.
Decompiling a hand-authored material and generating it back could fail on graph shapes Unreal
itself accepts. Found on LGUI's LexUI_ImageAndFont, LexUI_RectBlock and MF_LexUI_SDF_Font.
- Switch-style nodes —
StaticSwitch,FeatureLevelSwitch,QualitySwitch,ShadingPathSwitch,VertexInterpolatorand friends — report no output value type, so the "assume float4" fallback oversized them and everything downstream. AnAppendVectorfed by a float3 material-function output was emitted asfloat5(...); appends are now clamped to a float4, with a warning when a count still disagrees. VertexColoris emitted as float4 so the alpha pin's swizzle is valid. It used to be typed from the RGB pin and produce.aon a three-component value.- An input's own channel mask now replaces the connected pin's mask instead of stacking on it,
so
.rgb.ano longer appears when a graph wires the RGB pin but masks alpha. - A
StaticBoolfunction input keeps theStaticBooltype token.booldeclares a scalar pin, so the input used to come back as a float and reject every static-bool value passed to it. - Comment,
#Regionand description text carrying newlines or tabs is escaped, so a multi-line comment no longer splits the directive across lines. - A Custom node's additional outputs are declared on every emission of that node, and reading
one no longer rewrites the node's own return type. Previously the emission that did not select the
extra output produced a node without it, and the code body assigning to it failed at
shader-compile time with
use of undeclared identifier— long after generation reported success.
Fixed
- Cook: assets are materialized on the cook director only, and a generation error now fails the cook instead of shipping a stale asset.
- Generation refuses to overwrite assets DreamShader did not generate, and pre-validates graph syntax before clearing the target material.
- Generated-include identity hashes the project-relative source path; stored source paths are project-relative and no longer carry a generated-at timestamp.
- Runtime builds: guarded the editor-only
UEnum::HasMetaDatacall so non-editor and Shipping (store) builds compile (#12). - Bridge: adopted
FCoreDelegates::GetOnPostEngineInitfor UE 5.8, and constrained Clean Generated Shaders toIntermediatewith per-file deletes.
Compatibility
- Unreal Engine
5.3through5.8(Win64).
Source snapshot - 2026-06-10
Landed in the source tree between 1.4.0 and 1.5.0.
Automation baseline
- Added a DreamShader automation-test baseline covering minimal material parsing, minimal material
generation,
.dsfplusimportgeneration, Substrate material generation, source-hash skip, and a commandlet single-source compile smoke test. - The tests write temporary
.dsm/.dsf/.dshfiles underDShader/Tests/Automation, generate temporary assets under/Game/DreamShaderTests/Automation/…, and clean up after the run. source hash is unchangedis the stable assertion text for an unchanged source file skipping a duplicate generation.- Added the explicit bridge kill switch
-NoDreamShaderEditorBridgefor automation runs, so bridge startup scans stay out of the test log.
1.4.0 - 2026-06-06
Compatibility
- Added Unreal Engine
5.3through5.7compatibility coverage. - Verified single-plugin
RunUAT BuildPluginbuilds for UE5.3,5.4,5.5,5.6and5.7on Win64. - UE
5.7remains the active development target; UE5.3and5.4may need the MSVC14.38toolchain on Windows.
Substrate
- Completed the Substrate generation path:
Substrategraph values, theBase.FrontMaterialoutput binding, and theSubstrate.*wrappers. Substrate itself requires UE 5.4 or newer with Substrate enabled in the project — see Substrate Nodes. - The generator, the decompiler, type propagation and the editor manifest all recognize the Substrate type and its wrappers.
Material Preview
- The editor bridge can resolve a
.dsmsource, generate a preview material, and writeSaved/DreamShader/Bridge/preview.jsonplusPreview/*.png. - Added a local WebSocket preview service, listening on
127.0.0.1:17864by default, which feeds results and continuous frames to the VSCode preview panel.
1.3.9 - 2026-05-29
Maintenance
- Plugin version metadata updated to
1.3.9. - README, release notes and documentation references synchronized with the current language capabilities.
1.3.8 - 2026-05-25
Texture Support
- Added
VolumeTextureproperty parsing, code generation and default-texture handling. - Texture object subtypes are preserved during code generation, so
Texture2D,Texture2DArrayandVolumeTextureinputs reach the generated HLSL with the correct Unreal texture type.
Plugin Cleanup
- Removed built-in shader library path support from the project settings and the documentation.
1.3.7 - 2026-05-18
Decompiler
- Generic
UE.Expression(...)decompilation exports reflected literal properties, so unsupportedMaterialExpressionnodes retain more editable state. TextureSampleParameter2Dnodes with connected graph inputs — UV coordinates, for instance — are exported as graph expressions instead of plainPropertiesdeclarations.- Fixed decompilation of
MaterialExpressionCustomnodes with dynamic named inputs and custom output-type metadata.
Performance
- Improved import performance for very large decompiled materials: less per-node package dirtying, throttled progress-text updates, and automatic layout skipped on large generated graphs.
1.3.6 - 2026-05-12
Build Fixes
DreamShaderSettings.hincludesMaterialDomain.hexplicitly, so projects that include the settings header directly resolveEMaterialDomainreliably.
1.3.5 - 2026-05-11
ShaderFunction Calls
Graphaccepts statement-style multi-outputShaderFunctionandVirtualFunctioncalls: positional inputs first, output target variables after.
Dream Shader Function Files
- Added
.dsfDream Shader Function files for reusable generatedShaderFunctionassets. .dsmand.dsffiles can import.dsffiles, so generated functions are reusable across DreamShader sources.- Added
.dsfsource discovery, dependency tracking, and the VSCode workspace file association.
Decompiler
- Added Content Browser export actions:
UMaterialto.dsm,UMaterialFunctionto.dsf. - Decompiled files are written under
DShader/Decompiled/MaterialsorDShader/Decompiled/Functionswith unique file names. - Common constants, parameters, arithmetic nodes, swizzles, texture samples, Custom nodes and
MaterialFunction calls are exported as DreamShader graph text; less common reflected nodes fall
back to
UE.Expression(...).
1.3.4 - 2026-05-11
Output Initializers
Outputsaccepts initialized declarations such asvec3 Color = Tint;.- A
Shaderblock can use initialized output declarations with an emptyGraph = {}block.
1.3.3 - 2026-05-11
Graph Swizzles
- Fixed vector property component counts, so
vec2/vec3properties bind throughRG/RGBinstead of always usingRGBA. - Fixed non-sequential swizzles such as
.gbrby generating explicitComponentMaskandAppendVectornodes.
1.3.2 - 2026-05-11
Material Function Generation
- Plugin version metadata updated to
1.3.2. - Generated
ShaderFunctioninput and output IDs are preserved across regeneration, so existingMaterialFunctionCallnodes in ordinary Unreal materials keep their connections. - The Graph and Custom/HLSL generation paths skip unused generated property nodes.
- Improved generated node placement, and avoided Unreal's full automatic layout pass on DreamShader-generated material graphs.
- Fixed a crash when regenerating an opened material function asset whose expressions were still rooted by the editor.
1.3.1 - 2026-05-09
Function Calls
- Single-output
FunctionandGraphFunctioncalls can be used as value expressions, for exampleColor = Texture::Sample2DRGB(BaseTex, UV0);— see Calls. - Multi-output
FunctionandGraphFunctioncalls still require explicit out variables, for exampleTexture::Sample2D(BaseTex, UV0, Color, Alpha);.
Graph Functions
- Added top-level and namespaced
GraphFunctionblocks for reusable HLSL Custom-node logic. GraphFunctionremains HLSL, butUE.*calls inside its body are converted into material nodes and passed into the Custom node as generated inputs.- Added GraphFunction argument validation, recursive-call detection, and explicit out-variable writeback.
1.3.0 - 2026-05-08
Shader Layer Functions
- Added top-level
ShaderLayer(Name="...", Root="...")andShaderLayerBlend(Name="...", Root="...")blocks. - Generated layer assets use Unreal's native
UMaterialFunctionMaterialLayer/UMaterialFunctionMaterialLayerBlendclasses. ShaderLayer/ShaderLayerBlendreuse the existingProperties,Inputs,Outputs,SettingsandGraphsections.- Added validation that a Shader Layer block outputs exactly one
MaterialAttributesvalue, and that a Shader Layer Blend block declares at least twoMaterialAttributesinputs. - Vector parameter properties keep their RGBA output available in
Graph, so.a/.wreads alpha and assignments to lower component counts use the leading channels automatically.
Deprecated since 1.3.0
Use ShaderLayer instead.
MaterialLayer and MaterialLayerBlend remain compatibility aliases and emit warnings. New source
should use ShaderLayer and ShaderLayerBlend.
1.2.10 - 2026-05-08
VSCode MaterialExpression Manifest
- Added editor-side export of reflected
UMaterialExpressionmetadata toSaved/DreamShader/Bridge/material-expressions.json. - The manifest is refreshed on editor bridge startup and when the DreamShader VSCode workspace is opened.
- Exported metadata covers expression class names, editable reflected properties, expression
inputs, output pins, and inferred DreamShader
OutputTypehints. - The release workflow downloads the latest
dreamshader-language-supportGitHub Release assets and attaches them to DreamShader releases.
1.2.8 - 2026-05-05
Project Settings and Editor Entry Points
- Plugin version metadata updated to
1.2.8. - The
DreamShader.uplugindocumentation link now points athttps://lang.64hz.cn/, and the support link at the GitHub home page. - The Unreal Project Settings category moved from
PluginstoDreamPlugin, with the section displayed as Dream Shader and described asDream Shader Settings— see Project Settings. - Added the
OpenInNewWindowsetting under theEditorcategory. On by default, opening the DreamShader VSCode workspace from Unreal opens a new window; off,--reuse-windowis appended and an existing VSCode window is reused.
1.2.7 - 2026-05-05
Unreal 5.7 Compatibility
- Plugin version metadata updated to
1.2.7. - The generator picks up the header dependencies for
UMaterialExpressionFunctionInput/UMaterialExpressionFunctionOutput, matching the newer Unreal material-function node build environment. - The Moon Engine specific
MooaEncodedAttribute0throughMooaEncodedAttribute4outputs are now wrapped inMOON_ENGINEconditional compilation, so ordinary engine builds no longer depend on those custom material attributes. - This release does not change
.dsm/.dshsyntax; it is output targets and engine compatibility.
1.2.6 - 2026-04-30
ShaderFunction Properties
- Added a
Propertiessection toShaderFunction, declaring property and helper nodes local to the generated material function. - Added
constproperty declarations for scalar, vector and texture helper nodes that are not externally adjustable parameters. ShaderFunctionInputspreview defaults can reference the same function'sProperties, for exampleopt Texture2D BaseColorTex = PreviewTex;.
1.2.5 - 2026-04-30
Material Attributes
- Added
MaterialAttributesas a graph value type forShader,ShaderFunctionandVirtualFunctionsignatures. - Added struct-like member writes such as
Attrs.BaseColor = Color;andAttrs.Roughness = Roughness;. - Added
Base.MaterialAttributes = Attrs;output binding, which enables Use Material Attributes on the generated material automatically. MaterialAttributesvalues can be returned from generated or virtual material functions and passed throughGraphassignments.
1.2.4 - 2026-04-30
Parameter Reflection
- The documented comma-style metadata suffix was replaced with a semicolon-separated trailing reflection block on declarations.
- Parameter reflection blocks can set any reflected
UMaterialExpressionproperty exposed by the generated parameter node. - The basic
float, vector and texture shorthand declarations use the same reflection path as explicit parameter node declarations. - Texture sample parameters can configure reflected properties such as
SamplerType,SamplerSource,MipValueMode,AutomaticViewMipBias,ConstCoordinateandConstMipValue.
1.2.3 - 2026-04-29
Parameters
- Added declaration metadata
[Group="...", SortPriority=32, Description="..."]for materialPropertiesand for function input/output declarations. - Added explicit parameter node declarations:
ScalarParameter,VectorParameter,TextureObjectParameter, the texture sample parameter family,StaticBoolParameterandStaticSwitchParameter— see Property Types. - Added
StaticSwitchParametergraph calls, for exampleUseDetail(True=detailColor, False=baseColor). - Added
UE.CollectionParam(Collection=Path(...), Parameter="...")for Material Parameter Collection reads.
Function Defaults
- Added
optinputs forShaderFunctionandVirtualFunction. - Added the
defaultcall argument for optional material function inputs, preserving Unreal FunctionInput preview defaults. - Generated
ShaderFunctionassets write input and output descriptions and sort priorities to the FunctionInput / FunctionOutput nodes. - VirtualFunction copy, create and sync emit optional inputs, preview defaults and pin metadata when available.
1.2.2 - 2026-04-29
VirtualFunction Workflow
CreateVirtualFunctionreuses the existing declaration for the selected material function instead of creating duplicate.dshfiles.- When a matching declaration already exists, the material function
DreamShadermenu showsOpenVirtualFunctionandCopy Virtual Function Referenceinstead of the create and copy-definition actions. OpenVirtualFunctionopens the existing declaration in VSCode and jumps to the declaration location where possible.- Added startup validation and refresh for
VirtualFunctiondeclarations underDShader, reporting missing sourceUMaterialFunctionassets and updating changed signatures.
Import Compatibility
import "File.dsh"works with or without a trailing semicolon in the Unreal generator import pass.
1.2.1 - 2026-04-29
Editor Workflow
- Replaced the single material function toolbar action with a
DreamShaderdropdown menu. - Added
CopyVirtualFunction,CreateVirtualFunctionandCopyVirtualFunctionCallto the material function editor toolbar and the material function asset context menu. CreateVirtualFunctionwrites a.dshdeclaration under the configuredDShader/VirtualFunctionsdirectory and opens it in the default external editor.CopyVirtualFunctionCallcopies a ready-to-pasteGraphcall using the generated input names and the first output.- Added Open Dream Shader Workspace (VSCode) to the editor Tools menu and the DreamShader toolbar
section. It writes
DShader/DreamShader.code-workspace, opens it in VSCode when available, and falls back to the default editor or Notepad.
Release
- Added a GitHub Actions release workflow that packages the plugin source and publishes a GitHub Release from version tags or manual workflow dispatch.
1.2.0 - 2026-04-28
VirtualFunction
- Added
VirtualFunction(Name="...")declarations for existing UnrealUMaterialFunctionassets. VirtualFunctioncalls work fromGraphlikeShaderFunctioncalls, without generating or overwriting the referenced asset.Options.AssetsupportsPath(Game, "..."),Path(Engine, "..."),Path(Plugin.PluginName, "...")/Path(Plugins.PluginName, "..."), and full Unreal object paths.- Added material function context-menu and Material Editor toolbar actions that copy a complete
VirtualFunctiondeclaration with inputs, outputs and options.
Asset Roots
Root="Plugin.PluginName"maps to the project plugin content root, physically saving generated assets under[Project]/Plugins/PluginName/Content.Plugins.PluginNameandPlugins/PluginNameremain compatibility spellings.
Tooling
- The VSCode extension picked up
VirtualFunctionhighlighting, completion, hover, snippets, signature help and diagnostics. - Project content plugin names are completed inside
Path(Plugins.)as well.
1.1.4 - 2026-04-28
Asset Generation
Root="Plugins.PluginName"/Root="Plugins/PluginName"are supported as compatibility spellings, resolving identically toRoot="Plugin.PluginName".- This avoids
Plugins.MoonToonbeing treated as an ordinary/Game/Plugins_MoonToonsubdirectory — see Asset Paths.
1.1.3 - 2026-04-28
Asset Generation
- Clarified that
Root="Plugin.PluginName"targets an enabled project content plugin only. Plugin.MoonToonresolves to the UE package root/MoonToon, physically saved under[Project]/Plugins/MoonToon/Content.- The generator validates that the target plugin sits in the project
Pluginsdirectory, is enabled, can contain content, and has aContentdirectory.
1.1.2 - 2026-04-28
Language and Generation
- Added the
Roottop-level attribute toShaderandShaderFunction, selecting the generated asset's root path. Rootdefaults toGameand also acceptsPlugin.PluginName, saving the generatedUMaterialorUMaterialFunctioninto an enabled project content plugin root.- When a
ShaderFunctionis called fromGraph, the generatedUMaterialFunctionasset is resolved and loaded through that function's ownRoot.
Documentation
- Updated the asset generation notes in the plugin README, the language reference and the site.
1.1.1 - 2026-04-26
Fixed
- Fixed a
Functioncall with severaloutparameters inGraph, where the Custom node's trailing output pins received no value. - The first
outof a multi-outputFunctionstill comes back through the Custom node's mainreturn; the second and lateroutparameters now generate explicit assignments writing the__ds_*_outNtemporaries back to the matching Additional Output, for exampleOutput_ToonA = __ds_xxx_out1;.
Compatibility
- A patch release. No
.dsm/.dshchanges are required.
1.1.0 - 2026-04-22
Language and Graph
- Renamed the
Code = { ... }block in materials and material functions toGraph = { ... }, separating the graph DSL from the HLSL helper layer. - Added basic
if/elsesupport toGraph— see Control Flow. - Improved output expression handling: an output binding records source text rather than only a variable name, allowing more flexible parsing of graph outputs.
- Improved type conversion and generic
UE.*MaterialExpression argument handling, reducing friction when patching nodes in by hand.
Function and Generation
- Added
Function SelfContainedandFunction Inline, embedding helper dependencies in the Custom node so generated materials can be handed to projects without the DreamShader plugin installed. - An ordinary
Functionstill generates a.ushhelper include, referenced from the Custom node. - Added a cleanup workflow for generated shader files, reducing leftover historical includes.
Packages and Workflow
- Added the Package system, distributing and installing reusable
.dshshared libraries through GitHub — see Packages. - Added the import dependency graph: saving a shared
.dshfinds the affected.dsmfiles and refreshes them incrementally. Later versions extend this to.dsfdependencies. - Cached the config directory, cutting the cost of repeatedly parsing project settings.
Diagnostics and Compatibility
- Diagnostics carry stage, platform and quality context, separating parse, generation and material compile problems — see Diagnostics.
- Removed the default mapping for the Toon shading model, so generated results do not unexpectedly depend on a project-custom shading model.
- Updated the README, language reference and example documentation to match.
1.0.0 - 2026-04-21
Initial Version
- The
.dsm/.dshfile model: Unreal materials and shared helpers described as text sources. Shader(Name="...")generates aUMaterial;ShaderFunction(Name="...")generates aUMaterialFunction.Properties,Settings,Outputsand the early graph-building syntax.- HLSL-style
Functionhelpers, generating Custom node code. - Baseline documentation and examples, as the first public DreamShaderLang release.