问题标签 [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.
opengl - 使用从 wglChoosePixelFormatARB 获得的像素格式时,SetPixelFormat 返回 false
当我使用 SetPixelFormat 为 hDC 设置像素格式时,它返回 false。我使用了 GetLastError(),我得到一个错误代码 2000(表示无效的像素格式)。
代码如下:
这些代码是在创建并激活 FALSE openGL 上下文Create WGL之后。
windows - 创建 OpenGL 窗口 win32 API
我正在尝试使用 win32 api 在已经存在的父窗口内创建一个 OpenGL 窗口。但是,在创建子项时,函数 CreateWindowEx 返回 NULL,并出现错误 1407 ERROR_CANNOT_FIND_WND_CLASS。该窗口必须是子窗口,以便为其他控件(例如按钮和复选框)留出空间......
创建父窗口的部分代码:
在消息循环中,我正在创建子窗口:
我查看了几个教程(NeHe、cs.rit.edu和许多其他教程,但我不能发布超过 2 个链接),它们都用作L"OpenGL"
函数中第二个参数的类名CreateWindowEx()
。
我究竟做错了什么?“OpenGL”是一个有效的类名,例如“Edit”/“Static”/“Button”吗?我可以用别的东西代替它吗?我尝试了“静态”,但它没有渲染任何东西。
我知道有很多库(GLFW、SDL、...)可以处理窗口创建,但我需要使用纯 win32 API。
更新:
RegisterClass() 解决了这个问题。这是对我有用的代码:
opengl - 使用 EGL 1.4 查询 OpenGL32.dll 版本问题
我是 Windows 系统上的 C++ 应用程序开发人员。我正在使用 EGL 1.4 和 OpenGL ES 2.0 开发应用程序。
在某一个OpenGL32.DLL版本中,我发现出现了PVR错误信息。导致此问题的 OpenGL32.DLL 版本是 Win8.1 上的 6.3.9600.16384 和 4.0.1379.1。消息说:
当我在 EGL API 中调用 eglChooseConfig() 或 eglGetConfigs() 函数来获取系统配置时,会出现此消息。
我认为出现这个问题是因为上面提到的 OpenGL32.dll 版本不支持 wglChoosePixelFormatARB() 函数。
我测试的大多数版本都运行良好。工作版本列表是:
不工作版本的列表是:
为了解决这个问题,我想在我的产品中包含这个 dll 文件用于商业用途。我想知道分发 OpenGL32.dll 的工作版本是可能的。你能知道没有这个错误的 OpenGL32.dll 版本列表和关于 OpenGL32.dll 的许可信息吗?
performance - wglGetCurrentContext 是否同步 GPU 和 CPU?
使用 OpenGL 编程时,应避免使用 glGet 函数,因为它们会强制 GPU 和 CPU 同步,这是否也适用于获取当前 OpenGL 上下文句柄的 wgl 函数“wglGetCurrentContext”?如果没有,wglGetCurrentContext 是否还有其他性能问题?
c++ - 不要#include两者和任何一个或者
在 GL/glcorearb.h 中,可以找到以下注释。
不要在同一个源文件中同时#include GL/glcorearb.h 和 GL/gl.h 或 GL/gext.h。
但是,这是我可以让我的代码工作的唯一方法。我有 wglCreateContextAttribsARB 的 display.ha 声明。这需要 GL/wgext.h。但是,除非包含 GL/glcorearb.h 或 GL/gl.h,否则 GL/wgext.h 会出现未定义的错误。
这里有什么问题?“源文件”是否可能仅指 .cpp (无论如何都可以正常工作)?
c - Not understanding why context creation failing with win32 api and OpenGL and wgl
So i have followed all of the fundamental instructions in windows creation for OpenGL rendering context
the problem is to do when i try to create a core profile context with opengl , it fails and i get the "the program stopped working" message from windows when i run the a.exe file, there is no indication where the problem exists and what is causing the problem , i even tried to run gdb but it only refers to the function
wglCreateContextAttribsARB and no other information is given
here is my files which are currently included in the program
mainWin.c
winMain.h
and finally glPart.c
now if i do this the old way without wglCreateContextAttribsARB it works fine and does what it is supposed to do even without the shaders , but when i try to do this by creating a core profile context with wgl is when the program fails
i compile with
and no error are given
c# - P/Invoking "wglChoosePixelFormatARB" 使堆栈失衡
我正在尝试使用一些 pinvokes 为某些单元测试设置 wgl 上下文,但是(到目前为止)我的一种方法使堆栈失衡。
我所做的是首先创建一个窗口并获取它的 DC。当我与 kernel32、user32、gdi32 库交谈时,这一切都有效。我想用 OpenGL 绘制到 pbuffer,为了创建 PB,我需要使用扩展。这需要我有一个上下文......这一切都是可悲的正常并且到目前为止工作。
当我尝试创建 pbuffer 时,问题就来了。当我尝试使用 获取配置wglChoosePixelFormatARB
时,这似乎使堆栈不平衡。我刚刚执行了另一个 ARB 方法 ( wglGetExtensionsStringARB
) 来检查扩展 - 并且使用相同的父 DC 可以正常工作。
所以,开始编码......我的代表看起来像这样:
我发现它是这样的:
我这样调用它:
其本机方面是(未导出):
函数 def 是这样的:
代码对我来说看起来不错,但一定有问题:) 我希望有人能指出我的错误。
如果需要更多代码,我将所有这些都放在一个文件中,该文件只是一个普通的控制台应用程序: https ://gist.github.com/mattleibow/755eba3c8ff5eafb9549842a0abb0426
(代码有大量注释,这只是因为我正忙于从 C++ 移植到 C#。三分之一的代码只是 dllimports/structs/enums)
windows - 如果给定“HDC”(设备上下文)的 DirectX 上下文已经存在,“wglCreateContext”会安全失败吗
我正在尝试为一个跨平台、内存安全的 API 做出贡献,用于在 Rust 中创建和使用称为glutin的 OpenGL 上下文。正在努力以允许用户为预先存在的窗口创建 GL 上下文的方式重新设计 API。
提出的一个问题是,如果用户尝试为具有预先存在的 DirectX 上下文的窗口创建 GL 上下文,这可能不是内存安全的。
的文档wglCreateContext
表明它将NULL
在失败时返回,但是它没有详细说明可能导致这种情况的条件。
如果给定(设备上下文)的 DirectX 上下文已经存在,是否会wglCreateContext
安全失败(通过返回)?还是这种情况下的行为未定义?NULL
HDC
我无法访问支持 OpenGL 的 Windows 机器,也无法自己直接测试。
c++ - 使用 WGL 创建现代 OpenGL 上下文?
我正在尝试使用 Windows 函数创建一个 OpenGL 上下文(现代版本)。
基本上代码就是:
- 创建窗口类
- 注册班级
- 创建一个窗口
- 选择
PIXELFORMATDESCRIPTOR
并设置它 - 创建旧版 OpenGL 上下文
- 使上下文成为当前的
glewInit()
- 创建新窗口
- 创建现代像素格式属性数组
- 设置格式
- 创建现代 OpenGL 上下文
- 使上下文成为当前的
在此之后,我尝试画一个正方形(使用 VAO 和 VBO)。
结果是:Windows窗口有效,glClear(GL_COLOR_BUFFER_BIT)
有效,但未绘制正方形(display()
函数)。
如果我使用 OpenGL 2.0 上下文,它会绘制正方形(像以前一样使用 VAO 和 VBO),所以问题一定出在 OpenGL 3.2 的初始化上。
我哪里错了?
这是代码:
windows - WGL 调用会降低 Nvidia 系统上内存分配的性能
我们的 C++ 应用程序在使用 Nvidia 显卡的某些系统上使用 WGL 创建窗口(以及使用 OpenGL 进行渲染)时遇到了严重的性能问题。一旦创建了一个窗口,或者更准确地说,只要调用了ChoosePixelFormat或SetPixelFormat,内存分配在进程的整个生命周期内都会显着变慢。这发生在我们可以访问的多种不同系统上,但在 Windows 8.1 Pro 64 位和 Windows 10 Enterprise 64 位上的Quadro M6000 12 GB(驱动程序版本 385.69)和Titan Xp (驱动程序版本 387.92)最为明显. 在较低程度上,这种影响也可以在 GeForce 卡和 Windows 7 Professional 64 位上测量到。
我制作了一个小型测试应用程序来演示该问题。我们运行一个涉及大量内存分配的昂贵作业,然后使用 WGL 创建一个窗口,调用 ChoosePixelFormat,删除该窗口,然后再次运行相同的昂贵内存分配。内存分配是定时的并输出到控制台。在我们测试过的所有系统(六种不同的卡,三种操作系统)上,调用 ChoosePixelFormat 后内存分配明显变慢(在 5% 和 20% 之间)。但是,当我们将 Quadro 或 Titan Xp 放入系统时,ChoosePixelFormat 之后的内存分配占用了之前的 300% 以上。
一些测试结果(我们在系统之间交换了卡以涵盖几乎所有组合,但我们没有保留所有基准,但这是一个有意义的子集):
我记得我会在我的 Optimus 笔记本电脑上使用一个老技巧,这样自己编写的应用程序会自动使用离散的 Nvidia GPU:将可执行文件重命名为wow.exe. 我试过这个,当然,它有效。在我们的实际应用程序和测试应用程序中,性能问题都消失了。在 Titan Xp 上,调用 ChoosePixelFormat 后的内存分配奇迹般地比调用它之前更快。我很确定这是因为为魔兽世界所做的视频驱动程序中的特殊分支绕过了一些让我们的生活变得艰难的“功能”。所以现在我们可以收工并发布名为 wow.exe 的软件,但在某些时候,客户可能会问这个名称代表什么,我们必须想出一个巧妙的首字母缩略词或重新命名。这不是一个永久的解决方案,而是一个非常奇怪的调试结果。(“显卡供应商不想让你知道的事情:用这个简单的技巧提高 3D 应用程序的性能!”)
在调试链接的测试应用程序时,您可以看到在窗口创建期间,一个或多个线程由在窗口破坏后仍然存在的视频驱动程序产生。我们怀疑他们以某种方式参与了所有这一切。但是,我们既没有时间也没有预算对此进行进一步调查。
除了将我们的软件命名为 wow.exe、降级到 GTX 1080 或等待 Nvidia 回答我们的支持查询(他们四年没有做过一次)之外,我们现在还有哪些选择?有没有人遇到过并成功克服了这个问题?在 Windows 7/8.1/10 上使用 WGL 创建窗口和 OpenGL(4.5 核心)上下文时,有什么方法可以绕过 ChoosePixelFormat 和 SetPixelFormat?(我们也尝试使用 GLFW 设置窗口,但我很确定这会在后台调用 WGL - 结果是相同的。)此外,我们会对拥有 Maxwell 或 Pascal Quadro 卡的人的任何评论非常感兴趣或没有遇到这些问题的 Titan Xp。也许我们的设置中的一个小改动就可以解决问题。
PS:虽然这个问题听起来有点离奇,但我们并不是第一个遇到的。之前已经描述过,但显然,Nvidia 没有时间回复或解决这个问题。