public static GLShader CreateShader(string fileName, ShaderType type)
        {
            uint     shaderId = GL.CreateShader(type);
            GLShader shader   = new GLShader(shaderId, type);

            shaders.Add(fileName, shader);

            return(shader);
        }
        public static void DeleteShader(GLShader shader)
        {
            if (shader.AssociatedPrograms.Count > 0)
            {
                throw new InvalidOperationException("Cannot delete shader, it is attached to alteast 1 program!");
            }

            GL.DeleteShader(shader.Id);
        }
Example #3
0
        public ShaderProgram(uint programId, GLShader[] shaders)
        {
            this.ProgramId = programId;
            this.Shaders   = shaders;

            // Attach and associate shaders
            for (int i = 0; i < Shaders.Length; i++)
            {
                GLShader shader = Shaders[i];
                GL.AttachShader(ProgramId, shader.Id);
                shader.AssociateProgram(this);
            }
        }
Example #4
0
        public void Dispose()
        {
            if (CleanedUp)
            {
                return;
            }

            CleanedUp = true;

            // Detach and unassociate shaders
            for (int i = 0; i < Shaders.Length; i++)
            {
                GLShader shader = Shaders[i];
                GL.DetachShader(ProgramId, shader.Id);
                shader.UnassociateProgram(this);
            }

            // Delete program
            GL.DeleteProgram(ProgramId);
        }
 public static bool TryGetShader(string originalPath, out GLShader shader)
 {
     return(shaders.TryGetValue(originalPath, out shader));
 }
Example #6
0
        public Shader(string vertexFilePath, string fragmentFilePath, string[] vertexLibs = null, string[] fragLibs = null)
        {
            this.Name          = this.GetType().Name;
            uniforms           = new Dictionary <string, Uniform>();
            attributeLocations = new HashSet <int>();

            // Load shaders from file
            int numShaders = 2 + (vertexLibs != null ? vertexLibs.Length : 0) + (fragLibs != null ? fragLibs.Length : 0);

            GLShader[] shaders = new GLShader[numShaders];

            int shaderI = 0;

            // Main shaders
            shaders[shaderI++] = GLoader.LoadShader(vertexFilePath, ShaderType.VertexShader);
            shaders[shaderI++] = GLoader.LoadShader(fragmentFilePath, ShaderType.FragmentShader);

            // Libraries
            if (vertexLibs != null)
            {
                for (int i = 0; i < vertexLibs.Length; i++)
                {
                    shaders[shaderI++] = GLoader.LoadShader(vertexLibs[i], ShaderType.VertexShader);
                }
            }
            if (fragLibs != null)
            {
                for (int i = 0; i < fragLibs.Length; i++)
                {
                    shaders[shaderI++] = GLoader.LoadShader(fragLibs[i], ShaderType.FragmentShader);
                }
            }

            // Create program
            Program = GLoader.CreateProgram(shaders);

            // Bind attributes
            this.BindAttributes();

            // Link Program
            GL.LinkProgram(Program.ProgramId);

            int linkStatus = GL.GetProgram(Program.ProgramId, ProgramParameter.LinkStatus);

            if (linkStatus == 0)
            {
                string programState = GL.GetProgramInfoLog(Program.ProgramId);
                throw new GPUResourceException(String.Format("Program Failed to Link. Vertex: {1}, Fragment: {2}, Reason: {0}",
                                                             programState, vertexFilePath, fragmentFilePath));
            }

            // Validate the program
            GL.ValidateProgram(Program.ProgramId);

            int validateStatus = GL.GetProgram(Program.ProgramId, ProgramParameter.ValidateStatus);

            if (validateStatus == 0)
            {
                string programState = GL.GetProgramInfoLog(Program.ProgramId);
                throw new GPUResourceException(String.Format("Program Failed to Validate. Vertex: {1}, Fragment: {2}, Reason: {0}",
                                                             programState, vertexFilePath, fragmentFilePath));
            }

            // Connect texture units
            Start();
            this.ConnectTextureUnits();
            Stop();
        }