问题标签 [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++ - 从上下文共享的 QOpenGLWidget 崩溃
我在顶级小部件中有两个QOpenGLWidget
s( view1
, ) 作为子级。view2
Qt 文档说“当多个 QOpenGLWidgets 作为子级添加到同一个顶级小部件时,它们的上下文将相互共享”。所以,view1
并view2
分享 OpenGL 上下文。我试图渲染在view1
's context 中初始化的相同场景,并且应用程序在 view2's 中崩溃paintGL()
。我做错了什么?
这是简化的代码:
c# - 如何使用 GLFW.Net 初始化 OpenGL.NET?
我正在尝试在 C# 中使用 OpenGL 和 GLFW。我已经为 GLFW.Net 和 OpenGL.Net 安装了 NuGet 包。我一生无法弄清楚的是,如何使用 GLFW.Net 设置 OpenGL.Net 的上下文?当我尝试运行我非常基本的测试 OpenGL 代码时,没有出现错误消息。IE
但没有任何渲染。这是否意味着我的上下文不存在,或者我很愚蠢并留下了一些东西?
c++ - 在 OpenGL 中使用 Qt3D 离屏渲染纹理
目标
我想为 Qt3D 实现一个实际的小部件,因为QWidget::createWindowContainer
它不适合我。
问题描述
我让新类子类化的第一种方法QWidget
并QSurface
没有成功,因为 Qt3D 代码在多个地方QWindow
都需要 a或 a ,我不想重新编译整个 Qt3D 基础。QOffscreenSurface
我的第二个想法是将 Qt3D 内容渲染到屏幕外表面,然后在QOpenGLWidget
. 当我使用QRenderCapture
framegraph 节点将渲染到屏幕外纹理的图像保存,然后将图像加载到 a并在's函数QOpenGLTexture
中绘制它时,我可以看到渲染的图像 -即在 Qt3D 和 OpenGL 小部件中的渲染工作正常。与直接从 Qt3D 渲染内容相比,这非常慢。QOpenGLWidget
paintGL
现在,当我在 的渲染期间使用 的GLuint
返回来绑定纹理时,一切都保持黑色。QTexutre2D
QOpenGLWidget
当然,如果QOpenGLWidget
和 QT3D 的上下文完全分开,这将是有道理的。但是通过从中检索,AbstractRenderer
我QRenderAspectPrivate
能够获得 Qt3D 使用的上下文。在我的main.cpp
我设置
Qt3D的QOpenGLWidget
和 的上下文都引用了相同的共享上下文 - 我通过使用打印两者来验证这一点qDebug
,它们是同一个对象。
这不应该允许我使用 Qt3D 中的纹理吗?
或者关于如何实现这样一个小部件的任何其他建议?我只是认为这是最简单的方法。
实施细节/到目前为止我尝试过的
这就是我的paintGL
函数的QOpenGLWidget
样子:
m_colorTexture
是QTexture2D
附加到Qt3D 将场景渲染到屏幕外的QRenderTargetOutput
/的那个。QRenderTarget
我有一个QFrameAction
适当的位置来触发绘制更新QOpenGLWidget
:
我已经验证这确实调用了该paintGL
函数。所以每次我绘制 时QOpenGLWidget
,框架都应该准备好并出现在纹理中。
我也试过m_colorTexture
用QSharedGLTexture
. QOpenGLWidget
然后我用这样的上下文创建了这个纹理
在resizeEvent
函数中,QOpenGLWdiget
我在这个纹理以及 Qt3D 的所有屏幕外资源上设置了适当的大小。这也只显示黑屏。qDebug() << glGetError();
绑定纹理后直接放置0
每次都会显示,所以我假设没有任何错误。
代码可以在我的 GitHub 项目中找到。
opengl - 在 OpenGL 上下文之间同步资源时是否需要调用 glFinish?
我在我的应用程序中使用了两个 OpenGL 上下文。
第一个用于渲染数据,第二个用于后台加载和生成 VBO 和纹理。
当我的加载上下文生成一个 VBO 并将其发送到我的渲染线程时,我会在我的 VBO 中获得无效数据(全为零),除非我调用glFlush
或glFinish
在加载上下文上创建 VBO 之后。
我认为这是由于我的加载上下文没有任何缓冲区交换或任何告诉 GPU 开始处理其命令队列并且什么都不做(这导致渲染上下文侧的 VBO 为空)。
据我所见,这种刷新在 Windows 上不是必需的(使用 Nvidia GPU 测试,即使没有刷新也可以工作),但在 linux/macOS 上是必需的。
苹果文档上的这个页面说调用glFlush
是必要的(https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESApplicationDesign/OpenGLESApplicationDesign.html)
如果您的应用在多个上下文之间共享 OpenGL ES 对象(例如顶点缓冲区或纹理),您应该调用 glFlush 函数来同步对这些资源的访问。例如,您应该在一个上下文中加载顶点数据后调用 glFlush 函数,以确保其内容已准备好被另一个上下文检索。
但是是调用glFinish
还是glFlush
必要的,或者是否有更简单/更轻的命令可以实现相同的结果?(哪个是必要的,glFlush
或者glFinish
?)
此外,在某处是否有关于此的文档或参考资料?我找不到任何提及,并且它似乎在实现之间的工作方式不同。
java - 如何检索 GL2 实例?
我目前正在编写一个使用 JOGL 绑定的游戏以使用 OpenGL,但我在这方面非常挣扎。
我需要使用我在实现 GLEventListener 的类的 init 方法中收集的 GL2 变量来初始化我的 vaos 和 vbos(对于每个组件)。像这样,
但是当我想使用这个变量时它是空的,因为它出现在方法 init 的调用之前(这对我来说很奇怪)。我还检查了 GLContext.getCurrent() 可能会检索一个 GL 实例,但上下文也是空的。
所以我想知道上下文是在哪里创建的,是什么触发了上面的 init 函数?
也许我可以简单地创建一个布尔值来告诉组件何时在我的渲染函数中被初始化,所以可能会调用 GL init 方法。
qt - 在 QObject 之外访问 QtOpenGLContext 以创建纹理
在程序中,我试图为 QOpenGLWidget(上下文是 opengl 3.3)加载一些纹理,在它之外,使用纹理管理器类(类 Textrues(){};)。在纹理中,我尝试使用
( f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>(); ) 有没有比使用外部类更好的方法来处理多个纹理?我不想把所有东西都塞进 QOpenGLWidget 中,但据我所知,它只有 initGL 和paintGL 中的上下文。这条线有效吗?请详细说明上下文在 QT 中的工作原理。
必须在运行时加载多个图像(用户从文件资源管理器中选择的任何图像)。上下文本身没有问题,但 Textures 不是 QObject,并且没有自己的表面。
opengl - 如何在不需要任何窗口系统库的情况下使用 OpenGL 渲染到内存?
我想使用 OpenGL(1.5 版)将图像渲染到内存,而不在屏幕上显示它们(例如,我可以将它们保存为图像文件或在终端中将它们渲染为 ASCII)。我不想要任何 I/O。我在 SO 发现了类似的问题,但没有一个可以解决我接下来的具体进一步要求。
现在我想我可以使用像 glx 这样的库并告诉它不要打开任何窗口,但是我也不希望我的代码依赖于像 X11 这样的任何窗口系统库,因为我的程序根本不对任何窗口做任何事情或 I/O,我不明白为什么我的程序应该依赖于 X 窗口(因为某些系统根本没有 X 窗口,它们甚至可能根本没有图形界面)。我的程序应该只依赖于 OpenGL 驱动程序。
我知道为此我需要创建一个 OpenGL 上下文,它不是 OpenGL 的一部分,它依赖于平台,所以实际上我可能需要一些库来理想地以多平台方式创建 OpenGL 渲染到内存上下文(即抽象掉依赖于平台的东西)。这样的事情存在吗?(我对任何专有的、特定于 GPU 或特定于驱动程序的软件不感兴趣,该程序应该在任何支持给定 OpenGL 版本的 GPU 上运行。)还有什么我应该考虑的吗?
基本上我希望我的程序非常小,并且不会因为它不需要的东西而负担,因为它所需要的只是使用通用的 OpenGL 驱动程序将图像渲染到内存中,并且应该在任何具有这种 OpenGL 驱动程序的系统上工作。
谢谢你。