public override void CleanUp() { AttributeIDs.Clear(); UniformIDs.Clear(); GL.DeleteProgram(program); }
public void SetUniformVector4(string uniformName, ref Vector4 value) { if (UniformIDs.ContainsKey(uniformName)) { int uniformID = UniformIDs[uniformName]; if (uniformID != -1) { GL.Uniform4(uniformID, value); } } }
public void SetUniformMatrix4(string uniformName, bool transpose, ref Matrix4 value) { if (UniformIDs.ContainsKey(uniformName)) { int uniformID = UniformIDs[uniformName]; if (uniformID != -1) { GL.UniformMatrix4(uniformID, transpose, ref value); } } }
public void SetUniform1(string uniformName, double value) { if (UniformIDs.ContainsKey(uniformName)) { int uniformID = UniformIDs[uniformName]; if (uniformID != -1) { GL.Uniform1(uniformID, value); } } }
public Shader(string name) : base(name) { var vsFileStream = Resources.GetFile(ShaderRootPath + Name + ".vs"); string vsCode; using (var sr = new StreamReader(vsFileStream)) { vsCode = sr.ReadToEnd(); } int vs = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(vs, vsCode); GL.CompileShader(vs); var fsFileStream = Resources.GetFile(ShaderRootPath + Name + ".fs"); string fsCode; using (var sr = new StreamReader(fsFileStream)) { fsCode = sr.ReadToEnd(); } int fs = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(fs, fsCode); GL.CompileShader(fs); program = GL.CreateProgram(); GL.AttachShader(program, vs); GL.AttachShader(program, fs); GL.LinkProgram(program); GL.DetachShader(program, vs); GL.DetachShader(program, fs); int attributeCount; GL.GetProgramInterface(program, ProgramInterface.ProgramInput, ProgramInterfaceParameter.ActiveResources, out attributeCount); for (int i = 0; i < attributeCount; i++) { int size; int length; ActiveAttribType type; StringBuilder attributeName = new StringBuilder(); GL.GetActiveAttrib(program, i, (int)ProgramInterfaceParameter.MaxNameLength, out length, out size, out type, attributeName); AttributeIDs.Add(attributeName.ToString(), GL.GetAttribLocation(program, attributeName.ToString())); } int uniformCount; GL.GetProgramInterface(program, ProgramInterface.Uniform, ProgramInterfaceParameter.ActiveResources, out uniformCount); for (int i = 0; i < uniformCount; i++) { int size; int length; ActiveUniformType type; StringBuilder uniformName = new StringBuilder(); GL.GetActiveUniform(program, i, (int)ProgramInterfaceParameter.MaxNameLength, out length, out size, out type, uniformName); UniformIDs.Add(uniformName.ToString(), GL.GetUniformLocation(program, uniformName.ToString())); } }