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); }
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); } }
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)); }
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(); }