最小的无窗口 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 可以。
【讨论】:
“不起作用”是什么意思?ReleaseDC
和 DeleteDC
不是等价物,它们的用途完全不同。以上是关于最小的无窗口 OpenGL 上下文初始化的主要内容,如果未能解决你的问题,请参考以下文章
freeglut窗口初始化+ glew 3.0上下文创建不起作用[关闭]