Пример #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();
        }
Пример #2
0
        private static void WritePixelShaders(EffectCodeGenerator generator,
                                              TechniqueSymbol technique, TechniquePassSymbol pass, string uniquePassName)
        {
            Dictionary <string, List <string> > exports = new Dictionary <string, List <string> >();

            pass.ForEachFragment(generator, (codeGenerator, symbol, s) => WritePixelShader(codeGenerator, symbol, s, exports));

            ScriptTextWriter writer = generator.Writer;

            writer.WriteLine("// -------- technique {0}, pass {1} pixel shader entrypoint --------", technique.Name, pass.Name);
            writer.WriteLine("{0}_PIXELOUTPUT {0}_ps(const {0}_PIXELINPUT i)", uniquePassName);
            writer.WriteLine("{");
            writer.WriteLine("\tgPixelInput_{0} = i;", uniquePassName);
            writer.WriteLine();
            writer.WriteLine("\t{0}_PIXELOUTPUT output = ({0}_PIXELOUTPUT) 0;", uniquePassName);
            writer.WriteLine();
            pass.ForEachFragment(generator, (g, f, s) =>
            {
                ShaderCodeBlockNode shader = f.FragmentNode.PixelShaders.GetCodeBlock(generator.Context.TargetShaderProfile);
                if (shader != null)
                {
                    writer.WriteLine("\t{0}_{1}_ps(gPixelInput_{0}.{1}, output);", uniquePassName, f.UniqueName);
                }
            });
            writer.WriteLine();
            writer.WriteLine("\treturn output;");
            writer.WriteLine("}");
            writer.WriteLine();
        }
Пример #3
0
        public static string PreProcessCodeBlock(string uniqueFragmentName, ShaderCodeBlockNode codeBlock, Dictionary <string, List <string> > exports, List <ExportedValue> exportedValues = null, bool onlyExports = false)
        {
            string processedCode = codeBlock.Code;

            if (!onlyExports)
            {
                // Check program for imports.
                processedCode = ProcessImports(processedCode, exports);
            }

            // Check program for exports.
            processedCode = ProcessExports(processedCode, exports, uniqueFragmentName, exportedValues);

            return(processedCode);
        }
Пример #4
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();
            }
        }