最小的无窗口 OpenGL 上下文初始化

Posted

技术标签:

【中文标题】最小的无窗口 OpenGL 上下文初始化【英文标题】:Minimal Windowless OpenGL Context Initialization 【发布时间】:2011-08-15 08:06:32 【问题描述】:

如何用最少的代码初始化无窗口的 OpenGL 上下文?

我读过here,您可以使用wglCreateContextAttribsARB 来创建无窗口上下文,但它没有说明如何?

【问题讨论】:

为什么需要它?渲染成图像,或为 GPGPU 使用计算着色器? 【参考方案1】:

来自链接:

创建一个没有窗口的上下文,用于离屏渲染。这实际上可能不起作用。

第二句话很重要。来自WGL_ARB_create_context specification:

4) 是否有一种方法可以在不绑定的情况下使上下文成为当前的 它可以同时绘制到一个窗口系统吗?

已解决:是的,但仅限于 OpenGL 3.0 及更高版本。这导致一个 具有无效默认帧缓冲区的上下文,其含义是 在 OpenGL 3.0 规范中定义。

注意:显然在 Windows 上,opengl32.dll 使用了可绘制对象 参数来标识驱动程序的命名空间,所以我们可能不是 能够解决它。

规范不允许您创建没有窗口的上下文,因为它需要您在设备上下文中设置的像素格式。但是您理论上可以在将上下文设置为当前时为 HDC 传递 NULL,这会导致 OpenGL 没有默认帧缓冲区。

但是,如上所述,这实际上可能行不通。你可以试试看会发生什么,但我不抱希望。

【讨论】:

感谢您的回答。那么创建无窗口上下文最简约的方法是什么? 另一种尝试是使用屏幕 DC(将 NULL 传递给 GetDC 例程)。 @Luca:你不能设置根/屏幕窗口的PIXELFORMATDESCRIPTOR!并且 OpenGL 上下文绑定到的可绘制对象必须具有兼容的像素格式。因此,您的建议是非常糟糕的建议。【参考方案2】:

通常实现离屏渲染的方式是:

    创建一个虚拟窗口 + OpenGL 上下文以访问扩展 获取创建PBuffer的函数 创建 PBuffer DC 在 PBuffer 上创建 OpenGL 上下文 销毁虚拟窗口

另一种选择是使用 Framebuffer Objects (FBO) 创建常规 OpenGL 窗口,但不是渲染到主帧缓冲区,而是渲染到 Framebuffer 对象缓冲区,使 OpenGL 窗口不可见。

【讨论】:

对于初学者来说可以有一个代码sn-p吗?【参考方案3】:

其他东西:

HDC  hdc = CreateDC(L"DISPLAY",NULL,NULL,NULL);

但是ReleaseDC 不能使用它。DeleteDC 可以。

【讨论】:

“不起作用”是什么意思? ReleaseDCDeleteDC 不是等价物,它们的用途完全不同。

以上是关于最小的无窗口 OpenGL 上下文初始化的主要内容,如果未能解决你的问题,请参考以下文章

freeglut窗口初始化+ glew 3.0上下文创建不起作用[关闭]

我的渲染技术进阶之旅glfw库简单介绍

我的渲染技术进阶之旅glfw库简单介绍

我的渲染技术进阶之旅glfw库简单介绍

使用 cygwin 编译器的定制 win32 窗口上的 OpenGL 不起作用

具有多个设备(监视器)的 OpenGL 上下文