两个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 所做的并将自定义渲染上下文与设备上下文交换)但它最终是我的错误原因。
我在调用 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 所做的并将自定义渲染上下文与设备上下文交换)但它最终是我的错误原因。