将 OpenGL 4.5 代码降级到 OpenGL 3.0

Downgrading OpenGL 4.5 code to OpenGL 3.0

我找到了一个 repo 来解决我在使用 OpenGL 时遇到的问题,但它都是用 GL 4.5 编写的,我正在编写的应用程序需要是 GL 3.0 代码才能获得 OSX 支持。我已经能够通过在 docs.GL 上引用它并将其转换回我熟悉的 3.0 代码来翻译大部分代码。

我在理解下面的代码方面遇到了一些困难,所以我只是想知道是否有人能够为我指出正确的方向。

vertexArray vertexBuffer indexBuffer 都是int

GL.VertexArrayVertexBuffer(vertexArray, 0, vertexBuffer, IntPtr.Zero, Unsafe.SizeOf<ImDrawVert>());
GL.VertexArrayElementBuffer(vertexArray, indexBuffer);

GL.EnableVertexArrayAttrib(vertexArray, 0);
GL.VertexArrayAttribBinding(vertexArray, 0, 0);
GL.VertexArrayAttribFormat(vertexArray, 0, 2, VertexAttribType.Float, false, 0);

GL.EnableVertexArrayAttrib(vertexArray, 1);
GL.VertexArrayAttribBinding(vertexArray, 1, 0);
GL.VertexArrayAttribFormat(vertexArray, 1, 2, VertexAttribType.Float, false, 8);

GL.EnableVertexArrayAttrib(vertexArray, 2);
GL.VertexArrayAttribBinding(vertexArray, 2, 0);
GL.VertexArrayAttribFormat(vertexArray, 2, 4, VertexAttribType.UnsignedByte, true, 16);

编辑:如果有人想知道,我将 OpenTK 与 C# 结合使用。

对于将来偶然发现此特定问题的任何人,我必须阅读 GL 4.5 代码的描述并将其与 GL 3.0 代码相匹配。

对于这个特定的代码片段,它变成:

GL.BindVertexArray(vertexArray);

GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer);

GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, Unsafe.SizeOf<ImDrawVert>(), 0);

GL.EnableVertexAttribArray(1);
GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, Unsafe.SizeOf<ImDrawVert>(), 8);

GL.EnableVertexAttribArray(2);
GL.VertexAttribPointer(2, 4, VertexAttribPointerType.UnsignedByte, true, Unsafe.SizeOf<ImDrawVert>(), 16);