internal GLGraphicsContext(Func <string, IntPtr> getProcAddress, int maxVertices) : base(maxVertices) { glInit(getProcAddress, 4, 0); glClearColor(_clearColor.R, _clearColor.G, _clearColor.B, _clearColor.A); _vertexBuffer = glGenBuffer(); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, Vertex.SizeInBytes * maxVertices, IntPtr.Zero, GL_DYNAMIC_DRAW); GLUtility.CheckErrors(nameof(glBufferData)); _vertexArray = glGenVertexArray(); glBindVertexArray(_vertexArray); glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SizeInBytes, IntPtr.Zero); GLUtility.CheckErrors(nameof(glVertexAttribPointer)); glVertexAttribPointer(1, 4, GL_FLOAT, false, Vertex.SizeInBytes, (IntPtr)Marshal.SizeOf <Vector3>()); GLUtility.CheckErrors(nameof(glVertexAttribPointer)); glVertexAttribPointer(2, 2, GL_FLOAT, false, Vertex.SizeInBytes, (IntPtr)(Marshal.SizeOf <Vector3>() + Marshal.SizeOf <Vector4>())); GLUtility.CheckErrors(nameof(glVertexAttribPointer)); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); ushort[] indices = new ushort[1024 * 6]; for (ushort i = 0, vertex = 0; i < indices.Length; i += 6, vertex += 4) { indices[i] = vertex; indices[i + 1] = (ushort)(vertex + 1); indices[i + 2] = (ushort)(vertex + 3); indices[i + 3] = (ushort)(vertex + 1); indices[i + 4] = (ushort)(vertex + 2); indices[i + 5] = (ushort)(vertex + 3); } _indexBuffer = glGenBuffer(); glBindBuffer(GL_ARRAY_BUFFER, _indexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(ushort) * indices.Length, indices, GL_STATIC_DRAW); GLUtility.CheckErrors(nameof(glBufferData)); uint vertexShader = GLUtility.CreateAndCompileShader(GL_VERTEX_SHADER, VertexShaderCode); uint fragmentShader = GLUtility.CreateAndCompileShader(GL_FRAGMENT_SHADER, FragmentShaderCode); _program = GLUtility.CreateAndLinkProgram(vertexShader, fragmentShader); _vertTranformLocation = glGetUniformLocation(_program, "vertTransform"); _fragSamplerLocation = glGetUniformLocation(_program, "fragSampler"); glDisable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CW); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glActiveTexture(GL_TEXTURE0); }