Exemple #1
0
        private static void WriteVertexShader(EffectCodeGenerator generator, StitchedFragmentSymbol fragment,
                                              string uniquePassName, Dictionary <string, List <string> > exports)
        {
            ScriptTextWriter writer = generator.Writer;

            writer.WriteLine("// -------- vertex shader {0} --------", fragment.UniqueName);

            ShaderCodeBlockNode shader = fragment.FragmentNode.VertexShaders.GetCodeBlock(generator.Context.TargetShaderProfile);

            if (shader != null)
            {
                string shaderCode = StitchedEffectPreProcessor.PreProcessCodeBlock(fragment.UniqueName, shader, exports);
                shaderCode = ReplaceOutputCalls(shaderCode, fragment.UniqueName);
                WriteShaderCode(generator, fragment, shaderCode, "VERTEXINPUT", "VERTEXOUTPUT", "vs", uniquePassName);
            }
            else
            {
                // Need to auto-generate vertex shader. Simply pass through all vertex inputs.
                writer.WriteLine("void {0}_{1}_vs({0}_{1}_VERTEXINPUT input, inout {0}_VERTEXOUTPUT output)", uniquePassName, fragment.UniqueName);
                writer.WriteLine("{");
                writer.Write(GetVertexPassThroughCode(fragment));
                writer.WriteLine("}");
            }

            writer.WriteLine();
            writer.WriteLine();
        }
Exemple #2
0
        public void GenerateCode()
        {
            // If there are no vertex shaders in any of the fragments, disable vertex shader generation.
            // This is useful, for example, in post processing shaders where SpriteBatch is used.
            bool generateVertexShader = _stitchedEffect.StitchedFragments.Any(f => f.FragmentNode.VertexShaders.Any());

            HeaderCodeGenerator.GenerateAllHeaderCode(this, _stitchedEffect);
            ParameterGenerator.GenerateAllParameters(this, _stitchedEffect);
            SamplerGenerator.GenerateAllSamplers(this, _stitchedEffect);

            if (generateVertexShader)
            {
                StructGenerator.WriteAllVertexInputStructures(this, _stitchedEffect);
            }
            StructGenerator.WriteAllPixelInputStructures(this, _stitchedEffect);

            if (generateVertexShader)
            {
                StructGenerator.WriteAllVertexOutputStructures(this, _stitchedEffect);
            }

            StructGenerator.WriteAllPixelOutputStructs(this, _stitchedEffect);

            List <ExportedValue> exportedValues = StitchedEffectPreProcessor.GetExportedValues(_stitchedEffect);

            ExportedValueGenerator.GenerateExportDeclarations(this, exportedValues);

            if (generateVertexShader)
            {
                ShaderGenerator.WriteAllVertexShaders(this, _stitchedEffect);
            }
            ShaderGenerator.WriteAllPixelShaders(this, _stitchedEffect);

            TechniqueGenerator.GenerateAllTechniques(this, _stitchedEffect, generateVertexShader);
        }
Exemple #3
0
        private static void WritePixelShader(EffectCodeGenerator generator, StitchedFragmentSymbol stitchedFragment,
                                             string uniquePassName, Dictionary <string, List <string> > exports)
        {
            ShaderCodeBlockNode codeBlock = stitchedFragment.FragmentNode.PixelShaders.GetCodeBlock(generator.Context.TargetShaderProfile);

            if (codeBlock != null)
            {
                generator.Writer.WriteLine("// -------- pixel shader {0} --------", stitchedFragment.UniqueName);

                string shaderCode = StitchedEffectPreProcessor.PreProcessCodeBlock(stitchedFragment.UniqueName, codeBlock, exports);
                shaderCode = ReplaceOutputCalls(shaderCode, stitchedFragment.UniqueName);
                WriteShaderCode(generator, stitchedFragment, shaderCode, "PIXELINPUT", "PIXELOUTPUT", "ps", uniquePassName);

                generator.Writer.WriteLine();
                generator.Writer.WriteLine();
            }
        }