【发布时间】:2011-08-15 08:06:32
【问题描述】:
如何用最少的代码初始化无窗口的 OpenGL 上下文?
我读过here,您可以使用wglCreateContextAttribsARB 来创建无窗口上下文,但它没有说明如何?
【问题讨论】:
-
为什么需要它?渲染成图像,或为 GPGPU 使用计算着色器?
如何用最少的代码初始化无窗口的 OpenGL 上下文?
我读过here,您可以使用wglCreateContextAttribsARB 来创建无窗口上下文,但它没有说明如何?
【问题讨论】:
来自链接:
创建一个没有窗口的上下文,用于离屏渲染。这实际上可能不起作用。
第二句话很重要。来自WGL_ARB_create_context specification:
4) 是否有一种方法可以在不绑定的情况下使上下文成为当前的 它可以同时绘制到一个窗口系统吗?
已解决:是的,但仅限于 OpenGL 3.0 及更高版本。这导致一个 具有无效默认帧缓冲区的上下文,其含义是 在 OpenGL 3.0 规范中定义。
注意:显然在 Windows 上,opengl32.dll 使用了可绘制对象 参数来标识驱动程序的命名空间,所以我们可能不是 能够解决它。
规范不允许您创建没有窗口的上下文,因为它需要您在设备上下文中设置的像素格式。但是您理论上可以在将上下文设置为当前时为 HDC 传递 NULL,这会导致 OpenGL 没有默认帧缓冲区。
但是,如上所述,这实际上可能行不通。你可以试试看会发生什么,但我不抱希望。
【讨论】:
通常实现离屏渲染的方式是:
另一种选择是使用 Framebuffer Objects (FBO) 创建常规 OpenGL 窗口,但不是渲染到主帧缓冲区,而是渲染到 Framebuffer 对象缓冲区,使 OpenGL 窗口不可见。
【讨论】:
其他东西:
HDC hdc = CreateDC(L"DISPLAY",NULL,NULL,NULL);
但是ReleaseDC 不能使用它。DeleteDC 可以。
【讨论】:
ReleaseDC 和 DeleteDC 不是等价物,它们的用途完全不同。