问题标签 [wgl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
365 浏览

windows - Windows DC 和 GLRC 对应什么?

DC 在 Windows 中对应于什么?我知道我可以从 HWND 或 HMONITOR 获得 HDC。这是否意味着窗口的 DC 是其监视器 DC 的别名或代理?Windows 允许你说一个窗口类应该有它自己的 DC,所以看起来它们不是同一个 DC,尽管 Windows API 似乎也支持在 DC 之间建立父子关系。我会发现显示器的 DC 是父 DC 之一吗?

如果一个窗口跨越多个监视器会发生什么?Windows API 似乎只支持从窗口获取单个 HDC 并从 HDC 获取单个 HGLRC。我读过 OpenGL 不支持跨多个监视器的全屏窗口,因此您必须有多个窗口才能完成此操作。

SLI/Crossfire 系统会是单个 GLRC 吗?

在我看来,GLRC 与图形系统最相似。GLRC 代表一个单一的图形系统。DC 代表输出。GLRC 可以绘制到与连接到图形系统的输出相关联的任何 DC 以及这些 DC 的任何子 DC。您还可以拥有多个显示器和多个图形卡,每个都配对在一起,因此每个 GLRC 与每个 DC 配对。

正确还是确认?

0 投票
2 回答
236 浏览

opengl - 如何使用带有 opengl 的干净 xlib 启用着色器

我已经好几年没见过 OpenGl 了,现在我正在尝试用新的风格编写任何东西,但是我在绘制简单的三角形时遇到了问题。首先,我找不到任何具有良好示例且不使用“支持库”的教程,但这不是重点,下面的代码应该(我认为)绘制红色三角形,而不是绘制白色三角形,什么我做错了吗?

0 投票
2 回答
2624 浏览

opengl - 从 QOpenGLContext 获取 OpenGL (WGL) 上下文

我正在尝试从 QQuickView 窗口获取 OpenGL 上下文(HGLRC)。我需要将它传递给非 Qt 库。我可以很容易地得到一个 QOpenGLContext :

如何从 Qt 类中获取 OpenGL 上下文?(QOpenGL上下文)

0 投票
1 回答
3564 浏览

c++ - wglMakeCurrent 在 x64 上失败

我正在尝试在 x64 平台上创建一个 OpenGL 窗口。我的初始化代码适用于 x86/Win32,但在“wglMakeCurrent”处对 x64 失败。我猜问题出在像素格式的设置或获取DC(getDC())中。我已经为我的 PIXELFORMATDESCRIPTOR 尝试了不同的设置(假设 OpenGL 的 x64 实现不支持我正在使用的那个),但在那里没有成功。调试器表明 hdc 可能已损坏 - (类似于 0xfffffffff10102e0) - 但是 wglCreateContext 然后返回一个有效的外观 hglrc (即 0x0000000000010000)。但即使我将值从 hdc on-the-fly 更改为 0x0000000010102e0 (使用调试器,在调用 wglCreateContext 之前) wglMakeCurrent 仍然失败。

我在带有 Visual Studio 12 RC 1 的 Windows 8 上。有什么想法我在这里做错了吗?还是 x64 OpenGL 实现可能存在一些限制?

0 投票
2 回答
708 浏览

windows - wglCreateContext 返回 NULL,GetLastError 在许多 OpenGL 上下文中说“没有错误”

我有几个“插件”——DLL,它们都有一个 GUI,现在基于 OpenGL。一切正常,但是当我打开其中许多时,会出现问题(如下)......它发生在我的主要开发机器上,使用相当旧但仍然合理的 ATI Radeon HD 4600(使用最新的驱动程序,但仍然标记为旧版),但不是在一台既没有集成 Intel HD 也没有 NVidia 的非常现代的笔记本电脑上。

可能会发生两件事,似乎是随机的:

A) wglCreateContext 返回 NULL,但 GetLastError 表示一切正常!在这种情况下,我有使用 CPU 进行仿真的备份计划。慢,但工作...

很遗憾...

B)“aticfx64.dll”崩溃,访问冲突读取 0xffffffffffffffff。显然它是 ATI 驱动程序,但无论哪种方式都无法摆脱这种情况......

有任何想法吗?我的意思是打开这么多窗口并不完全正常,但它仍然应该能够处理它,对吧?我主要担心的是是否有一些限制或方法来处理这个问题。我只是有点担心这可能会发生在说 2 个窗口中……那会很糟糕。

0 投票
1 回答
3683 浏览

opengl - Why are functions duplicated between opengl32.dll and gdi32.dll?

The following functions are duplicated between opengl32.dll and gdi32.dll:

I have been searching for an answer for a long time now, but noone appears to have any concrete information why that is and what their exact difference is.

The OpenGL FAQ, section 5.190, suggests that these functions are not functionally identical:

To ensure correct operation of OpenGL use ChoosePixelformat, DescribePixelformat, GetPixelformat, SetPixelformat, and SwapBuffers, instead of the wgl equivalents, wglChoosePixelformat, wglDescribePixelformat, wglGetPixelformat, wglSetPixelformat, and wglSwapBuffers. In all other cases use the wgl function where available. Using the five wgl functions is only of interest to developers run-time linking to an OpenGL driver.

Does "run-time linking to an OpenGL driver" imply bypassing opengl32.dll and loading an ICD directly?

A stackoverflow thread named "Mesa3D does not like my context creation code", appears to reinforce this.

Another stackoverflow thread, named wglCreateContext in C# failing but not in managed C++ suggests that opengl32.dll must be loaded before gdi32.dll when using the GDI functions, or risk runtime failure (error: 2000).

My own testing indicates that "error: 2000" occurs on some systems (Nvidia, but not Intel or a Parallels VM) if the opengl32/wgl version of these functions is called. Changing to the GDI version clears this issue, but using LoadLibrary("opengl32.dll") does not appear to change anything.

Has anyone ever investigated the difference between these WGL and GDI functions? It is clear that there is some form of difference, and I am trying to understand which version should be used under which circumstances and what are the potential pitfalls if the wrong version is used.

Edit: wayback machine brings up a webpage that describes how direct loading of an ICD works. This was apparently required back in the Voodoo 1/2 days when the 2d and 3d accelerators were two different pieces of hardware with separate ICDs (which the normal opengl32.dll+ICD mechanism couldn't handle.) Quake 1 and 2 would apparently load ICDs directly because of this.

However, a post below shows that the AMD ICD does not export the wgl variants, which contradicts this idea.

There has to be someone or some place out there that holds the keys to this knowledge.

Edit 2: from the webpage above comes the clearest suggestion yet:

"Therefore if you are using a OpenGL driver named opengl32.dll you must call the GDI functions, and if you are not using a driver named opengl32.dll you must NOT call the GDI functions. "

But how does this fit in with the fact that the AMD ICD does not export wgl functions?

Edit 2: apparently Mesa3d exports WGL symbols, as can be seen here: http://cgit.freedesktop.org/mesa/mesa/tree/src/mesa/drivers/windows/gdi

This makes sense, since Mesa3d is not supposed to be used as an ICD. This fits with the pattern in the Mesa3d thread linked above: their calls are not being routed through Microsoft's opengl32.dll, so gdi functions fail, but Mesa3d is exporting wgl* functions so these still work. However, that's specific to Mesa3d - that method would fail if you tried to use AMD's ICD directly.

0 投票
1 回答
6517 浏览

c++ - wglGetProcAddress 返回 NULL

我试图使用 WGL_ARB_pbuffer 进行 OpenGL 的屏幕外渲染,

但我在初始化过程中失败了。

这是我的代码。

所以实际上这在第二行结束,因为 wglGetExtensionsStringARB 得到了 NULL。

我不知道为什么 wglGetProcAddress 不起作用。

我包括了“wgext.h”,并且我在标题中定义如下。

为什么我不能按预期使用 wglGetProcAddress?

0 投票
0 回答
777 浏览

opengl - 我对 OpenGL 的 WGL_ARB pbuffer 有问题

我试图用 WLG_ARB pbufer 进行屏幕外渲染,但我遇到了 wglCreatePbufferARB() 的问题,它总是返回 NULL。这是代码的一部分。

正如我所说,wglCreatePbufferARB 返回 NULL,所以我不能使用 wglGetBufferDCARB。其他 WGL_ARB 扩展函数运行良好,例如 wglGetExtensionsStringARB 和 wglChoosePixelformetARB。并且扩展得到了非常正常的字符串,它以“WGL_ARB_extensions_string ...”开头 wglCreatePbufferARB 使用的每个参数都不是NULL,包括hDC。那么为什么 wglCreatePbufferARB 仍然返回 NULL 并且不能按我的意图工作?

++ps 我调用了 GetLastError,它返回了 ERROR_INVALID_DATA。这是因为attribList,但它是怎么回事?感谢您建议致电 GetLastError。

++ps 我解决了这个问题。现在这工作得很好。谢谢!

0 投票
1 回答
284 浏览

windows - wglShareLists 是可传递的吗?我必须与其他人分享每个上下文吗?

例如,如果我与渲染上下文“B”共享渲染上下文“A”,然后与“A”共享渲染上下文“C”,“C”是否会与“B”共享?

0 投票
0 回答
624 浏览

opengl - WGL 扩展和虚拟机

我目前正在尝试在 VirtualBox 4.3.8 中运行的 WinXP 虚拟机上使用旧的 Rendermonkey 1.82。遗憾的是它不适用于 OpenGL,无法找到 WGL 扩展(确切的错误消息是:“未检测到 WGL PBuffer 扩展 - 请更新您的驱动程序。将无法继续进行 OpenGL 渲染。”)......即使该程序使用 DirectX 工作,我需要它与 OpenGL 一起使用

你知道这个问题有解决方案/解决方法吗?

还要考虑一下: - 基于 DirectX 的 3D 加速工作正常 - 其他基于 OpenGL 的程序工作正常 - 在 vm 设置中启用了 3D 加速 - 已安装并运行更新的 GuestAddition