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(); }
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(); }
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); }
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(); } }