Exemplo n.º 1
0
 internal GLProgram(bool valid, int programHandle, GLVertexSignature signature, GLUniformBlock[] uniformBlocks, GLUniform[] uniforms, string infoLog = null)
 {
     Valid = valid;
     Handle = programHandle;
     Signature = signature;
     UniformBlocks = uniformBlocks;
     Uniforms = uniforms;
     InfoLog = infoLog;
 }
Exemplo n.º 2
0
        public static GLProgram BuildShaderProgram(ShaderProgramSource source)
        {
            int programHandle = GL.CreateProgram();
            int vertexShaderHandle = 0,
                tessControlShaderHandle = 0,
                tessEvalShaderHandle = 0,
                geometryShaderHandle = 0,
                fragmentShaderHandle = 0;

            #region build single shaders
            if (source.HasVertexStage)
            {
                vertexShaderHandle = BuildSingleShader(ShaderType.VertexShader, source.VertexSource);
                GL.AttachShader(programHandle, vertexShaderHandle);
            }

            if (source.HasTessControlStage)
            {
                tessControlShaderHandle = BuildSingleShader(ShaderType.TessControlShader, source.TessControlSource);
                GL.AttachShader(programHandle, tessControlShaderHandle);
            }

            if (source.HasTessEvalStage)
            {
                tessEvalShaderHandle = BuildSingleShader(ShaderType.TessEvaluationShader, source.TessEvalSource);
                GL.AttachShader(programHandle, tessEvalShaderHandle);
            }

            if (source.HasGeometryStage)
            {
                geometryShaderHandle = BuildSingleShader(ShaderType.GeometryShader, source.GeometrySource);
                GL.AttachShader(programHandle, geometryShaderHandle);
            }

            if (source.HasFragmentStage)
            {
                fragmentShaderHandle = BuildSingleShader(ShaderType.FragmentShader, source.FragmentSource);
                GL.AttachShader(programHandle, fragmentShaderHandle);
            }
            #endregion
            #region pre linking operations
            #endregion
            #region linking
            GL.LinkProgram(programHandle);
            int programStatus;
            GL.GetProgram(programHandle, GetProgramParameterName.ValidateStatus, out programStatus);
            string infoLog = GL.GetProgramInfoLog(programHandle);
            #endregion
            #region post linking operations
            bool programValid = ValidateShaderProgram(programHandle);
            var uniforms = ExtractUniforms(programHandle);
            var uniformBlocks = ExtractUniformBlocks(programHandle, uniforms);
            var attributes = ExtractAttributes(programHandle);
            #endregion
            #region clear single shaders
            if (source.HasVertexStage)
            {
                GL.DeleteShader(vertexShaderHandle);
            }

            if (source.HasTessControlStage)
            {
                GL.DeleteShader(tessControlShaderHandle);
            }

            if (source.HasTessEvalStage)
            {
                GL.DeleteShader(tessEvalShaderHandle);
            }

            if (source.HasGeometryStage)
            {
                GL.DeleteShader(geometryShaderHandle);
            }

            if (source.HasFragmentStage)
            {
                GL.DeleteShader(fragmentShaderHandle);
            }
            #endregion

            var signature = new GLVertexSignature(attributes);
            return new GLProgram(programValid, programHandle, signature, uniformBlocks, uniforms, infoLog);
        }