I've been using Unity's Shader Graph heavily for the past year and genuinely love it for prototyping — but I keep hitting walls that force me back to hand-written HLSL, and I think it's worth talking about where that line actually is.
Where Shader Graph Earns Its Keep
For surface effects — dissolve shaders, triplanar blending, stylized toon ramps — it's hard to beat the iteration speed. Being able to preview sub-expressions in the node graph catches mistakes in minutes that would take me half an hour to debug in raw code. Godot's visual shader editor has a similar feel, though the compiled output is noticeably cleaner in my experience.
Where It Breaks Down
The compiled HLSL output from Unity's Shader Graph is rough. I had a water shader that looked fine but was burning 2ms on mobile — dropped to hand-written code and got it to 0.4ms with no visual difference. The graph had generated redundant normalize() calls inside loops and wasn't reusing computed values across passes the way I expected.
The other killer is custom lighting models. You can hack it with custom function nodes, but at that point you're writing HLSL inside Shader Graph, which gets you the worst of both worlds — no real IDE support, no easy diffing in version control, and the graph still adds overhead around your code.
My Current Approach
- Prototype everything in Shader Graph
- Profile on target hardware before shipping anything
- Hand-write anything that runs per-fragment in a hot path or needs non-standard lighting
- Keep Shader Graph variants for artists who need to iterate on material parameters
Curious whether anyone's found solid workflows for keeping Shader Graph maintainable on larger teams, or if you've moved away from it entirely. Also wondering if anyone's tried Amplify Shader Editor as a middle ground — the output code has always looked cleaner to me but I haven't used it on a shipped project.