首页 > 解决方案 > 将 OpenGL 4.5 代码降级到 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# 一起使用。

标签: c#openglopengl-3opengl-4

解决方案


对于将来偶然发现此特定问题的任何人,我必须阅读 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);

推荐阅读