private int /*GLuint*/ Compile(OpenGL.ShaderType type, string source)
        {
            OpenGLRendererBase.CheckGLErrors();

            var shader = OpenGL.GL.CreateShader(type);

            if (shader == 0)
            {
                throw new Exception/*RendererException*/ ($"Critical Error - Could not create shader object of type:{type}.");
            }

            OpenGLRendererBase.CheckGLErrors();

            // Define shader source and compile
            OpenGL.GL.ShaderSource(shader, source);

            OpenGL.GL.CompileShader(shader);

            // Check for errors
            OpenGL.GL.GetShader(shader, OpenGL.ShaderParameter.CompileStatus, out var status);

            if (status == 0)
            {
                OutputShaderLog(shader);
                return(0);
            }

            OpenGLRendererBase.CheckGLErrors();

            return(shader);
        }
        public virtual void Link()
        {
            // Attach shaders and link
            OpenGL.GL.AttachShader(d_program, d_vertexShader);

            if (d_geometryShader != 0)
            {
                OpenGL.GL.AttachShader(d_program, d_geometryShader);
            }

            if (d_fragmentShader != 0)
            {
                OpenGL.GL.AttachShader(d_program, d_fragmentShader);
            }

            OpenGL.GL.LinkProgram(d_program);

            // Check for problems
            OpenGL.GL.GetProgram(d_program, OpenGL.GetProgramParameterName.LinkStatus, out var status);

            if (status == 0)
            {
                OutputProgramLog(d_program);

                OpenGL.GL.DeleteProgram(d_program);
                d_program = 0;
            }

            OpenGLRendererBase.CheckGLErrors();

            if (d_program == 0)
            {
                return;
            }

            d_createdSuccessfully = true;
            OpenGLRendererBase.CheckGLErrors();
        }
        /// <summary>
        /// Creates and loads shader programs from the two strings supplied to it
        /// </summary>
        /// <param name="vertex_shader_source"></param>
        /// <param name="fragment_shader_source"></param>
        /// <param name="glStateChanger"></param>
        public OpenGLBaseShader(string vertex_shader_source,
                                string fragment_shader_source,
                                OpenGLBaseStateChangeWrapper glStateChanger)
        {
            d_glStateChanger      = glStateChanger;
            d_createdSuccessfully = false;
            d_vertexShader        = 0;
            d_fragmentShader      = 0;
            d_geometryShader      = 0;
            d_program             = 0;


            // Compile the shaders

            d_vertexShader = Compile(OpenGL.ShaderType.VertexShader, vertex_shader_source);
            if (d_vertexShader == 0)
            {
                return;
            }

            OpenGLRendererBase.CheckGLErrors();

            if (!string.IsNullOrWhiteSpace(fragment_shader_source))
            {
                d_fragmentShader = Compile(OpenGL.ShaderType.FragmentShader, fragment_shader_source);

                if (d_fragmentShader == 0)
                {
                    return;
                }
            }

            OpenGLRendererBase.CheckGLErrors();

            d_program = OpenGL.GL.CreateProgram();
        }