Beispiel #1
0
        public ShaderGenerationResult GenerateShaders()
        {
            ShaderGenerationResult result = new ShaderGenerationResult();

            foreach (ShaderSetInfo ss in _shaderSets)
            {
                GenerateShaders(ss, result);
            }

            // Activate processors
            foreach (IShaderSetProcessor processor in _processors)
            {
                // Kind of a hack, but the relevant info should be the same.
                foreach (GeneratedShaderSet gss in result.GetOutput(_languages.First()))
                {
                    ShaderSetProcessorInput input = new ShaderSetProcessorInput(
                        gss.Name,
                        gss.VertexFunction,
                        gss.FragmentFunction,
                        gss.Model);
                    processor.ProcessShaderSet(input);
                }
            }

            return(result);
        }
        public ShaderGenerationResult GenerateShaders()
        {
            if (_shaderSets.Count == 0)
            {
                throw new ShaderGenerationException("No shader sets were discovered.");
            }

            ShaderGenerationResult result = new ShaderGenerationResult();

            foreach (ShaderSetInfo ss in _shaderSets)
            {
                GenerateShaders(ss, result);
            }

            // Activate processors
            foreach (IShaderSetProcessor processor in _processors)
            {
                // Kind of a hack, but the relevant info should be the same.
                foreach (GeneratedShaderSet gss in result.GetOutput(_languages[0]))
                {
                    ShaderSetProcessorInput input = new ShaderSetProcessorInput(
                        gss.Name,
                        gss.VertexFunction,
                        gss.FragmentFunction,
                        gss.Model);
                    processor.ProcessShaderSet(input);
                }
            }

            return(result);
        }
Beispiel #3
0
        private void GenerateShaders(ShaderSetInfo ss, ShaderGenerationResult result)
        {
            TypeAndMethodName vertexFunctionName   = ss.VertexShader;
            TypeAndMethodName fragmentFunctionName = ss.FragmentShader;

            HashSet <SyntaxTree> treesToVisit = new HashSet <SyntaxTree>();

            if (vertexFunctionName != null)
            {
                GetTrees(treesToVisit, vertexFunctionName.TypeName);
            }
            if (fragmentFunctionName != null)
            {
                GetTrees(treesToVisit, fragmentFunctionName.TypeName);
            }

            foreach (LanguageBackend language in _languages)
            {
                language.InitContext(ss.Name);
            }

            ShaderSyntaxWalker walker = new ShaderSyntaxWalker(_compilation, _languages.ToArray(), ss);

            foreach (SyntaxTree tree in treesToVisit)
            {
                walker.Visit(tree.GetRoot());
            }

            foreach (LanguageBackend language in _languages)
            {
                ShaderModel    model  = language.GetShaderModel(ss.Name);
                ShaderFunction vsFunc = (ss.VertexShader != null)
                    ? model.GetFunction(ss.VertexShader.FullName)
                    : null;
                ShaderFunction fsFunc = (ss.FragmentShader != null)
                    ? model.GetFunction(ss.FragmentShader.FullName)
                    : null;
                {
                    string vsCode = null;
                    string fsCode = null;
                    if (vsFunc != null)
                    {
                        vsCode = language.GetCode(ss.Name, vsFunc);
                    }
                    if (fsFunc != null)
                    {
                        fsCode = language.GetCode(ss.Name, fsFunc);
                    }

                    result.AddShaderSet(language, new GeneratedShaderSet(ss.Name, vsCode, fsCode, vsFunc, fsFunc, model));
                }
            }
        }