两个OpenGL上下文调用wglsharelists报错1008的诊断

Diagnosis of error 1008 when calling wglsharelists for two OpenGL contexts

我在调用 wglsharelists 共享两个 OpenGL 上下文(使用 sharpgl 创建)的 space 时无法诊断错误 1008 的原因。调用 returns false,检索到的最后一个错误代码是 1008。

我已经使两个 OpenGL 上下文在构造上完全相同,并确保在调用共享列表函数时它们都不是当前的。我已将其简化为绝对最简单的形式,无法解决此错误。我还注意到,如果我在尝试 link 之前尝试访问任一渲染上下文指针,错误代码将更改为 3221684311。代码如下:

static void Main(string[] args)
{

    OpenGL gl1 = new OpenGL();
    gl1.Create(SharpGL.Version.OpenGLVersion.OpenGL3_1, RenderContextType.FBO, 1, 1, 16, null);

    OpenGL gl2 = new OpenGL();
    gl2.Create(SharpGL.Version.OpenGLVersion.OpenGL3_1, RenderContextType.FBO, 1, 1, 16, null);

    IntPtr rc1 = gl1.RenderContextProvider.RenderContextHandle;
    IntPtr rc2 = gl2.RenderContextProvider.RenderContextHandle;

    //These lines when uncommented change the return error to 3221684311
    //Debug.WriteLine("Render Context 1: " + rc1.ToString());
    //Debug.WriteLine("Render Context 2: " + rc1.ToString());

    Debug.WriteLine(Win32.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero));

    Debug.WriteLine(Win32.wglShareLists(rc1, rc2));
    Debug.WriteLine(GetLastError());
}

[DllImport("Kernel32.dll", SetLastError = true)]
private extern static UInt32 GetLastError();

事实证明问题出在从 SharpGL 创建渲染上下文中。在上下文中创建任何缓冲区的那一刻,它就不能设置为与另一个现有上下文共享。选择 FBO 上下文类型时,SharpGL 在调用 Create 方法时执行一些帧缓冲区的创建。通过将渲染上下文类型设置为 HiddenWindow,共享有效。

这绝不是一个解决方案(我想我将不得不编写自己的 FBO 创建代码来代替 SharpGL 所做的并将自定义渲染上下文与设备上下文交换)但它最终是我的错误原因。