void ISerializationHooks.AfterDeserialization()
        {
            switch (_rawKind)
            {
            case "source":
                Kind = ShaderKind.Source;
                if (path == null)
                {
                    throw new InvalidOperationException();
                }
                Source = IoCManager.Resolve <IResourceCache>().GetResource <ShaderSourceResource>(path);

                if (paramMapping != null)
                {
                    ShaderParams = new Dictionary <string, object>();
                    foreach (var item in paramMapping !)
                    {
                        var name = item.Key;
                        if (!Source.ParsedShader.Uniforms.TryGetValue(name, out var uniformDefinition))
                        {
                            Logger.ErrorS("shader", "Shader param '{0}' does not exist on shader '{1}'", name, path);
                            continue;
                        }

                        var value = _parseUniformValue(item.Value, uniformDefinition.Type.Type);
                        ShaderParams.Add(name, value);
                    }
                }
                break;

            case "canvas":
                Kind = ShaderKind.Canvas;
                var source = "";

                if (rawMode != null)
                {
                    switch (rawMode)
                    {
                    case "normal":
                        break;

                    case "unshaded":
                        source += "light_mode unshaded;\n";
                        break;

                    default:
                        throw new InvalidOperationException($"Invalid light mode: '{rawMode}'");
                    }
                }

                if (rawBlendMode != null)
                {
                    switch (rawBlendMode)
                    {
                    case "mix":
                        source += "blend_mode mix;\n";
                        break;

                    case "add":
                        source += "blend_mode add;\n";
                        break;

                    case "subtract":
                        source += "blend_mode subtract;\n";
                        break;

                    case "multiply":
                        source += "blend_mode multiply;\n";
                        break;

                    default:
                        throw new InvalidOperationException($"Invalid blend mode: '{rawBlendMode}'");
                    }
                }

                source += "void fragment() {\n    COLOR = zTexture(UV);\n}";

                var preset = ShaderParser.Parse(source, _resourceCache);
                CompiledCanvasShader = IoCManager.Resolve <IClydeInternal>().LoadShader(preset, $"canvas_preset_{ID}");
                break;

            default:
                throw new InvalidOperationException($"Invalid shader kind: '{_rawKind}'");
            }

            if (StencilDataHolder != null)
            {
                _stencilEnabled = true;
            }
        }