问题标签 [openglcontext]
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.
c++ - 从非主线程加载的 VAO 崩溃
在我的代码中,我有一个由两个缓冲区对象和一个顶点数组对象支持的对象的包装类。我在构造函数中使用它生成它们(稍微简化):
printf 在主线程的前几个创建中给出了这个。
在 VAO #2 和缓冲区 #3 之间有一个非索引的。这对我来说看起来不错。每个数组对象都有两个附加到它的唯一缓冲区。
我稍后也会使用此代码来加载后台资源(而是生成它们)。每个线程都有自己的上下文,使用 glfwCreateContext 创建并与主窗口共享资源。首次创建这些资源时,会出现以下输出:
此后很快,VAO #1 使用不同数量的顶点绘制 9 次,并且不可避免地会出现段错误。
我的问题是,这是一个错误还是我做错了什么?我正在运行带有 Nvidia 卡的戴尔笔记本电脑的 Linux Ubuntu 上对此进行测试。
opengl - 使用 OpenGL 两次绘制 QTMovie 的纹理
我目前正在使用 OpenGL 将 QTMovie 的帧显示到 NSOpenGLView 中。为此,我正在使用以下代码创建纹理上下文:
然后,我将视觉上下文分配给电影,以便将帧绘制到该上下文中。我得到了这个位的实际框架:
_currentFrameTex
CVOpenGLTextureRef在哪里。
所有这一切都适用于一个视图,但我想在第二个视图上绘制相同的框架,我无法想象如何做到这一点。
最简单的方法是什么?当然,它也应该是高性能的,因为它被称为每秒 60 次(至少)。
c++ - SDL2 - 检查是否创建了 OpenGL 上下文
我正在使用 SDL2 和 OpenGL 创建一个应用程序,它在 3 台不同的计算机上运行良好。但是在另一台计算机(更新的 Arch linux)上,它没有,并且它因以下错误而崩溃:
所以我的问题是:如何检查是否已经创建了 OpenGL 上下文?然后,如果它已经创建,我如何获得它的句柄?
如果我不能这样做,我该如何绕过这个问题?
c++ - GLFW 上下文中的 QOpenGLContext
我们有一个使用 GLFW 创建的 3D 渲染窗口,我们想使用 QWebkit 在渲染中显示 QWebPage(也就是将 QWebPage 渲染到 OpenGL 纹理)。仅使用 CPU 版本太慢,并且 Qt 支持将 QWebkit 渲染为 QOpenGLFramebufferObjects(使用 QOpenGLPaintDevice)。
但是,这样做需要创建一个 QOpenGLContext(它需要自己的窗口等等),最终会干扰我们的整个应用程序。(在 GLFW 和 Qt Context 之间切换也会导致无限量的 GL_INVALID_OPERATIONs)
最佳案例解决方案:我们让 Qt 使用 GLFW 上下文。
代码示例:
所以这里有一些问题:
- 是否可以让 Qt 使用 GLFW OpenGL 上下文?
- 如果没有,我们如何在 GLFW 上下文和 Qt 上下文之间切换?(使用纹理共享传输渲染的 QWebPage)
- 如果这一切都不可能,是否有一个免费的 Webkit 项目,支持 64 位、Windows/Linux/Mac 支持,可以使用 OpenGL 进行渲染?
c++ - wglCreateContextAttribsARB 函数崩溃
我尝试写下本教程中的代码。我有 InitializeOGL() 的代码:
当我尝试将上下文版本更改为 OpenGL 3.1 时,此处崩溃wglCreateContextAttribsARB() 函数(此指针正确进入LoadExtensions())。当我尝试在这里创建 OpenGL 4.0 时,函数wglSwapIntervalEXT() 会崩溃。我的显卡只处理 OpenGL 3.1。
我的问题是如何在这里成功地初始化 OpenGL 上下文?我必须做什么才能在 3.1 版中创建 OpenGL 上下文。
c++ - SDL2 丢失 OpenGL 上下文或未定义函数
我在显示器之外启动显示、渲染器和 OGL 上下文。这些都没有给出错误,以下是我创建这些元素的方式。
现在,在这些之后,像 glClearColor 或 glClear 这样的方法按预期工作,但是,像 glCreateProgram 或 glActiveTexture 这样的方法指向 NULL 并引发运行时异常。如果我不在标题中包含 glew,则甚至无法识别这些功能。
我是否以某种方式丢失了我的 OpenGL 上下文并最终出现错误,或者这些函数没有在 SDL 中定义,我必须使用另一个库来链接这些函数?
windows - 在 OpenGL 4.4 版中使用 glColor*
我正在更新我们古老的 OpenGL 代码。这是一个 Windows 系统,我正在使用 GLEW。OpenGL 版本是 4.4(以前,创建上下文的方式将我们限制为 1.1)。代码库很大,所以我想分阶段更新它(即现在让所有工作都在高于 1.1 的版本上运行,只需最少的工作)。到目前为止,我只找到了一个突破口。透明度不再起作用。我怀疑这可能是由于 glColor* 或 glTexEnv* 已被弃用。我试图请求特定版本的 OpenGL,但没有成功。你能告诉我我在上下文创建中做错了什么,或者我可以对绘制代码进行哪些更改以使透明度起作用吗?(当然还有其他帮助。)
这是上下文创建代码(为了便于阅读,删除了错误检查):
即使在请求版本 3.0 之后,也glGetString(GL_VERSION)
返回 4.4.0。我绘制到帧缓冲区,然后用于glReadPixels()
写入位图(尽管我认为这在这里并不特别相关)。
这是帧缓冲区代码(在上下文的生命周期内保持绑定):
这是绘制代码:
纹理现在以完全不透明度应用,无论发送到的 alpha 值如何glColor4f()
。但是,如果我更改 RGB 值,那么它仍然会反映在输出中。
opengl-es - LibGDX 关于恢复功能
我在 LibGDX 下遇到了 OpenGL ES 上下文丢失的问题,所以我试图弄清楚如何解决这个问题。我的第一步是在我扩展 Screen 的类中调用 resume 函数时实际重新初始化所有纹理。像这样:
resume 函数重新创建了我所有的图块(包括它们的纹理),所以我认为这会起作用。但是,根据文档: ApplicationListener Docs
永远不要在桌面上调用 resume 函数。现在,在我的 Android 手机上从未调用过 resume,但在我的桌面上,我告诉程序在 resume 方法中将“true”打印到控制台,瞧,实际上在桌面上调用了 resume 函数。
我的主要问题是:
- 为什么在我的桌面上会调用恢复功能,而在我的 Android 手机上却没有?
- 如何在我的 Android 手机的简历上重新加载我的纹理?目前我的纹理在按下返回键后恢复游戏时是白色的。有趣的是,当通过主页按钮退出时,纹理会重新加载。
android - 在 Android 上丢失上下文时如何保存 OpenGL 纹理
我们的游戏要求从小图像动态构建几个大纹理,并且我们不保留纹理的数据副本,我们只是使用 OpenGLglTexSubImage2d
来更新实际纹理。
当按下 Back 或游戏失去焦点时,我们希望将这些纹理保存到 ram,因此如果用户随后返回游戏,我们可以在onSurfaceCreated
. 我们已经从“磁盘”重新加载所有静态纹理。
然而,事实证明很难找到我们可以从哪里得到消息以知道我们即将失去 EGL 上下文。如果我们在主活动中设置一个标志,onBackPressed
然后在主渲染循环中检查该标志,我们可以将纹理保存在那里,但我们不能从主活动中访问纹理,所以将调用放在主活动的onStop
回调中也是如此晚的。没有后续的渲染循环来保存纹理,因为到那时它已经停止了。我们需要这样做,因为onStop
除了按下后退按钮之外,还有其他调用方式。
据说我不能拖延onStop
再获得一个“渲染”。还有其他想法吗?
android - Android库项目:需要在没有Context的情况下检索Resources
首先是一些背景(我总是喜欢人们提问时给出的):我正在编写一个图书馆项目。它是一个简单的 OpenGL '图形扭曲' 库。用户应该能够通过简单的调用来创建称为“区域”的某些对象
然后在它们上定义各种扭曲并绘制它们:
这里的所有都是它的。该库使用 OpenGL 来绘制以各种用户定义方式扭曲的区域(实际上是一个矩形位图)。
现在,问题来了:库需要访问其顶点和片段着色器,它们是与资源一起存储在“raw”文件夹中的 .glsl 文件。为了做到这一点,我们必须访问 Resources 对象,为了做到这一点,我们 AFAIK 必须拥有 Context 对象。因此,就目前而言,库必须首先通过调用进行初始化
这对我来说是个大问题,因为恕我直言,这让整个 API 变得笨拙。如果不是因为这个该死的 Context,就不需要初始化任何东西,用户只要想要就可以直接创建新对象,这在文档中很优雅且易于解释。一个单独的 init() 调用,只需要将 Context 对象传递给库,只需要检索 Resources 对象,只需要打开两个包含着色器代码的文件,这使得所有这些都非常笨拙.
我想简单地将着色器代码移动到我的库中的静态初始化字符串中,但这对于开发来说很麻烦(着色器有几百行相当复杂的代码,如果我将它们保存在单独的 .glsl 文件中,我可以有语法高亮等)
有什么建议吗?