public Shader Build(bool log = false) { Context.VertexDeclaration = VertexDeclaration; Context.MarkUsedVariables(() => FragmentShader.Generate(Context), GlFragColor, GlFragDepth); var commonCode = buildCommon(); var vertexShaderCode = buildVertexShader(); var fragmentShaderCode = buildFragmentShader(); if (log) { Trace.WriteLine("--- VERTEX ---"); Trace.WriteLine(commonCode + vertexShaderCode); Trace.WriteLine("--- FRAGMENT ---"); Trace.WriteLine(commonCode + fragmentShaderCode); } return(new Shader(commonCode + vertexShaderCode, commonCode + fragmentShaderCode)); }
public void Condition(Func <string> expression, ShaderSnippet trueSnippet, ShaderSnippet falseSnippet) { checkCanReceiveCommands(); if (code != null) { FlowDependant(() => $"if ({expression()})\n{{"); trueSnippet.Generate(this); if (falseSnippet != null) { code.AppendLine("}\nelse\n{"); falseSnippet.Generate(this); } code.AppendLine("}"); } else { FlowDependant(expression); trueSnippet.Generate(this); falseSnippet?.Generate(this); } }
private string buildVertexShader() { var code = new StringBuilder(); // Attributes foreach (var attribute in VertexDeclaration) { code.AppendLine($"attribute {attribute.ShaderTypeName} {attribute.Name};"); } VertexShader.GenerateFunctions(code); // Main function code.AppendLine("void main() {"); ProgramScope.DeclareUnusedVaryingsAsVariables(code, Context); VertexShaderScope.DeclareVariables(code); Context.GenerateCode(code, () => VertexShader.Generate(Context)); code.AppendLine("}"); return(code.ToString()); }