public StringBuilder WriteShader(string[] features,
                                         MicroSplatShaderGUI.MicroSplatCompiler compiler,
                                         MicroSplatShaderGUI.MicroSplatCompiler.AuxShader auxShader,
                                         string name,
                                         string baseName)
        {
            StringBuilder defines = new StringBuilder();
            var           blocks  = gen.GetShaderBlocks(features, compiler, auxShader);

            var shader = BuildTemplate(blocks, baseName);

            defines.AppendLine(blocks.defines);
            defines.AppendLine("\n   #define _HDRP 1");


            string shaderTarget = "4.6";

            if (features.Contains("_FORCEMODEL50"))
            {
                shaderTarget = "5.0";
            }

            if (features.Contains("_TESSDISTANCE"))
            {
                defines.AppendLine("\n      #define _TESSELLATION_ON 1");
                shader = shader.Replace("%TESSELLATION%", templateTess.text);
                shader = shader.Replace("%PRAGMAS%", "   #pragma hull Hull\n   #pragma domain Domain\n   #pragma vertex TessVert\n   #pragma fragment Frag\n   #pragma require tesshw\n");
            }
            else
            {
                shader = shader.Replace("%PRAGMAS%", "   #pragma vertex Vert\n   #pragma fragment Frag");
                shader = shader.Replace("%TESSELLATION%", "");
            }
            shader = shader.Replace("%SHADERTARGET%", shaderTarget);
            if (features.Contains("_USESPECULARWORKFLOW"))
            {
                defines.AppendLine("\n#define _USESPECULAR 1");
                defines.AppendLine("#define _MATERIAL_FEATURE_SPECULAR_COLOR 1");
            }

            defines.AppendLine();

            shader = shader.Replace("%SHADERNAME%", name);
            shader = shader.Replace("%PROPERTIES%", blocks.properties);
            shader = shader.Replace("%CODE%", blocks.code);
            shader = shader.Replace("%DEFINES%", defines.ToString());
            shader = shader.Replace("%CBUFFER%", blocks.cbuffer);
            string codeNoComments = blocks.code.StripComments();

            shader = SurfaceShaderRenderLoopAdapter.Strip(codeNoComments, shader);

            // standard pipeline stuff
            shader = shader.Replace("fixed", "half");
            shader = shader.Replace("unity_ObjectToWorld", "GetObjectToWorldMatrix()");
            shader = shader.Replace("unity_WorldToObject", "GetWorldToObjectMatrix()");

            //shader = shader.Replace("UNITY_MATRIX_M", "GetObjectToWorldMatrix()");
            //shader = shader.Replace("UNITY_MATRIX_I_M", "GetWorldToObjectMatrix()");
            //shader = shader.Replace("UNITY_MATRIX_VP", "GetWorldToHClipMatrix()");
            //shader = shader.Replace("UNITY_MATRIX_V", "GetWorldToViewMatrix()");
            //shader = shader.Replace("UNITY_MATRIX_P", "GetViewToHClipMatrix()");

            return(shader);
        }
        public StringBuilder WriteShader(string[] features,
                                         MicroSplatShaderGUI.MicroSplatCompiler compiler,
                                         MicroSplatShaderGUI.MicroSplatCompiler.AuxShader auxShader,
                                         string name,
                                         string baseName)
        {
            StringBuilder defines = new StringBuilder();
            var           blocks  = gen.GetShaderBlocks(features, compiler, auxShader);

            var shader = BuildTemplate(blocks, baseName);

            defines.AppendLine(blocks.defines);
            defines.AppendLine("\n   #define _STANDARD 1");


            string shaderTarget = "3.0";

            if (features.Contains("_TESSDISTANCE") || features.Contains("_FORCEMODEL46"))
            {
                shaderTarget = "4.6";
            }
            else if (features.Contains("_FORCEMODEL50"))
            {
                shaderTarget = "5.0";
            }

            if (features.Contains("_TESSDISTANCE"))
            {
                defines.AppendLine("\n      #define _TESSELLATION_ON 1");
                shader = shader.Replace("%TESSELLATION%", templateTess.text);
                shader = shader.Replace("%PRAGMAS%", "   #pragma hull Hull\n   #pragma domain Domain\n   #pragma vertex TessVert\n   #pragma fragment Frag\n   #pragma require tesshw\n");
            }
            else
            {
                shader = shader.Replace("%PRAGMAS%", "   #pragma vertex Vert\n   #pragma fragment Frag");
                shader = shader.Replace("%TESSELLATION%", "");
            }



            shader = shader.Replace("%SHADERTARGET%", shaderTarget);
            if (features.Contains("_USESPECULARWORKFLOW"))
            {
                defines.AppendLine("\n#define _USESPECULAR 1");
                defines.AppendLine("#define _MATERIAL_FEATURE_SPECULAR_COLOR 1");
            }

            defines.AppendLine();
            defines.AppendLine(templateCommonHLSL.text);

            string shaderDesk = templateShaderDesc.text;

            shaderDesk += templateChain.text;
            shader      = shader.Replace("%SHADERDESC%", shaderDesk);
            shader      = shader.Replace("%SHADERNAME%", name);
            shader      = shader.Replace("%PROPERTIES%", blocks.properties);
            shader      = shader.Replace("%CODE%", blocks.code);
            shader      = shader.Replace("%DEFINES%", defines.ToString());
            shader      = shader.Replace("%CBUFFER%", blocks.cbuffer);
            string codeNoComments = blocks.code.StripComments();

            shader = Strip(codeNoComments, shader);

            return(shader);
        }