示例#1
0
        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));
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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());
        }