public BasicShadedColoredMaterial() { var vertexShader = new GlShader(ShaderType.VertexShader); vertexShader.LoadSource(VertexShaderSource); var fragmentShader = new GlShader(ShaderType.FragmentShader); fragmentShader.LoadSource(FragmentShaderSource); Bind(); LoadShader(vertexShader); LoadShader(fragmentShader); Link(); PositionBuffer = new GlBuffer(BufferTarget.ArrayBuffer); PositionBuffer.Bind(); NormalBuffer = new GlBuffer(BufferTarget.ArrayBuffer); NormalBuffer.Bind(); ColorBuffer = new GlBuffer(BufferTarget.ArrayBuffer); ColorBuffer.Bind(); MatrixBuffer = new GlBuffer(BufferTarget.ArrayBuffer); MatrixBuffer.Bind(); var positionBufferLayout = new GlBufferLayout(); positionBufferLayout.Add(VertexAttribPointerType.Float, 3); //Vector3 3 floats var normalBufferLayout = new GlBufferLayout(); normalBufferLayout.Add(VertexAttribPointerType.Float, 3); var colorBufferLayout = new GlBufferLayout(); colorBufferLayout.Add(VertexAttribPointerType.Float, 4); var matrixBufferLayout = new GlBufferLayout(); matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1); //Matrix 16 floats matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1); matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1); matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1); VertexArray = new GlVertexArray(); VertexArray.AddBuffer(PositionBuffer, positionBufferLayout); VertexArray.AddBuffer(NormalBuffer, normalBufferLayout); VertexArray.AddBuffer(ColorBuffer, colorBufferLayout); VertexArray.AddBuffer(MatrixBuffer, matrixBufferLayout); }
public GlShaderProgram(string[] vertex_shader_source, string[] fragment_shader_source) { using (GlShader vertex_shader = new GlShader(ShaderType.VertexShader, vertex_shader_source)) using (GlShader fragment_shader = new GlShader(ShaderType.FragmentShader, fragment_shader_source)) { ProgramId = Gl.CreateProgram(); Gl.AttachShader(ProgramId, vertex_shader.ShaderId); Gl.AttachShader(ProgramId, fragment_shader.ShaderId); Gl.LinkProgram(ProgramId); Gl.GetProgram(ProgramId, ProgramProperty.LinkStatus, out int link_succeeded); if (link_succeeded == 0) { StringBuilder log = new StringBuilder(MaxErrorLength); Gl.GetProgramInfoLog(ProgramId, MaxErrorLength, out int log_length, log); throw new InvalidOperationException($"Failed to link program : {log}"); } } }