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