private static void IGRender2(ImDrawDataPtr dd) { if (dd.CmdListsCount == 0) { return; } for (int i = 0; i < dd.CmdListsCount; i++) { ImDrawListPtr cmd_list = dd.CmdListsRange[i]; int vertexSize = cmd_list.VtxBuffer.Size * Unsafe.SizeOf <ImDrawVert>(); if (vertexSize > VtxBufSize) { int newSize = (int)Math.Max(VtxBufSize * 1.5f, vertexSize); GL.NamedBufferData(VertexBuffer, newSize, IntPtr.Zero, BufferUsageHint.DynamicDraw); VtxBufSize = newSize; } int indexSize = cmd_list.IdxBuffer.Size * sizeof(ushort); if (indexSize > IdxBufSize) { int newSize = (int)Math.Max(IdxBufSize * 1.5f, indexSize); GL.NamedBufferData(IndexBuffer, newSize, IntPtr.Zero, BufferUsageHint.DynamicDraw); IdxBufSize = newSize; } } var io = ImGui.GetIO(); var MVP = Matrix4.CreateOrthographicOffCenter(0.0f, Engine.Width, Engine.Height, 0.0f, -1.0f, 1.0f); ImGuiProgram.Use(); ImGuiProgram.UniformMatrix4("Projection", ref MVP); GL.Uniform1(ImGuiProgram.UniformLocation("Texture"), 0); IG_VAO.Bind(); dd.ScaleClipRects(io.DisplayFramebufferScale); GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.ScissorTest); GL.BlendEquation(BlendEquationMode.FuncAdd); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); GL.Disable(EnableCap.CullFace); GL.Disable(EnableCap.DepthTest); for (int n = 0; n < dd.CmdListsCount; n++) { ImDrawListPtr cmdList = dd.CmdListsRange[n]; GL.NamedBufferSubData(VertexBuffer, IntPtr.Zero, cmdList.VtxBuffer.Size * Unsafe.SizeOf <ImDrawVert>(), cmdList.VtxBuffer.Data); GL.NamedBufferSubData(IndexBuffer, IntPtr.Zero, cmdList.IdxBuffer.Size * sizeof(ushort), cmdList.IdxBuffer.Data); int vOffset = 0; int iOffset = 0; for (int i = 0; i < cmdList.CmdBuffer.Size; i++) { ImDrawCmdPtr pcmd = cmdList.CmdBuffer[i]; if (pcmd.UserCallback != IntPtr.Zero) { throw new NotImplementedException(); } else { GLTexture.Active(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture2D, (int)pcmd.TextureId); var clip = pcmd.ClipRect; GL.Scissor((int)clip.X, Engine.Height - (int)clip.W, (int)(clip.Z - clip.X), (int)(clip.W - clip.Y)); if ((io.BackendFlags & ImGuiBackendFlags.RendererHasVtxOffset) != 0) { GL.DrawElementsBaseVertex(PrimitiveType.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (IntPtr)(iOffset * sizeof(ushort)), vOffset); } else { GL.DrawElements(BeginMode.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (int)pcmd.IdxOffset * sizeof(ushort)); } } iOffset += (int)pcmd.ElemCount; } vOffset += cmdList.VtxBuffer.Size; } GL.Disable(EnableCap.Blend); GL.Disable(EnableCap.ScissorTest); }