问题标签 [qopenglfunctions]
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.
qt - 需要使用 QT QOpenGLWidget 渲染 YUV 帧(来自 ffmpeg 的 AVFrame)
我有一个来自 FFMPEG 的 YUV 格式的 AVFrame。我想使用来自 QOpenGLWidget 和 QOpenGLFunctions 的 qt 派生类来渲染它。
我是 qt 和 OpenGL 的初学者。
有人可以帮忙吗?
谢谢阿斯温
c++ - QOpenGLContext 和原生 OpenGL 上下文之间的纹理共享不适用于 Mesa 驱动程序
我正在尝试将 UI 作为插件添加到使用 OpenGL 的现有应用程序中。为此,我将 UI 渲染为纹理,并在绘制场景后在 3D 场景顶部绘制该纹理。
纹理生成如下:
可能更有趣的部分是纹理的绘制:
我主要发现了这种绘制纹理的方法以及一些评论说这是不推荐使用的,但在使用更新的方法的全视图覆盖纹理上找不到太多。如果您对此有任何简短的资源/操作方法,我将不胜感激,但由于这远离我的专业领域,我真的不想在这方面投入超过几个小时,只是为了避免使用已弃用的代码。
我希望您对我正在努力实现的目标有一个清晰的了解。
这实际上在我的桌面上运行良好,使用 NVidia Geforce GTX 1080,使用 Ubuntu 16.04、Qt 5.5.1、OGRE 1.9.0 和 OpenGL 4.6 (GLSL 4.6) 以及在我的桌面上使用 Ubuntu 18.04、Qt 5.9.5、OGRE 1.9 的 VM .0 和 OpenGL 2.1 (GLSL 1.2)。但是,在我使用 Ubuntu 16.04、Qt 5.5.1、OGRE 1.9.0 和 OpenGL 3 (GLSL 1.3) 的笔记本上,它根本不起作用。
现在,显而易见的问题是:为什么会这样,我该如何解决?
完整的源代码可以在这里找到。
编辑:如果它很重要,如果我在底部示例中移动相机,白色区域也会改变。因此,我认为它们可能是场景渲染的剩余部分。
第二次编辑:我做了更多的调试,这不是我最初认为的错误的绘图,而是上下文切换。我已经在切换之前和之后将纹理保存到一个文件中,并且纹理看起来像之前预期的那样,并且在切换之后变得混乱。现在,我只需要弄清楚为什么。
c++ - 纹理呈现空白,但 glGetTexImage 完美运行
我编写了一些代码,将 UI 覆盖添加到现有的 OpenGL 应用程序中。
不幸的是,我不精通 OpenGL,但我知道它总是在某些设备上失败。
一些背景故事:
一般管道是:
应用程序渲染 -> UI 渲染到 FBO -> FBO 被 blitted 以获得 RGBA 纹理 -> 在 UI 场景之上绘制纹理。
到目前为止一切顺利,然后我在 Ubuntu 16.04 上的 Intel 卡上遇到了一个问题,其中纹理在上下文切换之间中断(UI 渲染是使用 QOpenGLContext 完成的,应用程序是由 OGRE 管理的原始 OpenGL 上下文,但 QOpenGLContext 设置为共享资源)。我通过检查共享是否有效(在一个上下文中创建纹理并检查另一个上下文中的内容是否正确)解决了这个问题,如果不是,我在上下文 B 中加载内容并在上下文 A 中再次上传。但是,由于某种原因,在同一台机器上的 Ubuntu 18.04 上,这实际上可以工作。使用 检索其内容时,纹理在其他上下文中仍然正确glGetTexImage
。
现在问题来了:它没有被渲染。我得到的只是应用程序场景,顶部没有任何东西,但是如果我手动启用下载它并重新上传到在应用程序上下文中创建的纹理的解决方法,它就可以工作。
纹理的内容怎么可能没有问题,但除非我使用抓取它glGetTexImage
并将其重新上传到在其他上下文中创建的纹理,否则它不会显示glTexImage2D
?
使用 glTexImage2D 时,一定有一些无效的状态并且设置正确。
下面是 UI 渲染后的代码:
顶点着色器
片段着色器
TL;DR 纹理未渲染(完全透明),但如果我使用glGetTexImage
它将其复制到内存中看起来很好,并且如果我将其复制回在应用程序上下文中创建的纹理,它将渲染得很好。
显卡是带有 Mesa 版本 18.2.8 的 Intel UHD 620。
编辑:如果不清楚,我在应用程序的上下文中复制纹理而不是纹理的原始上下文,与创建工作纹理的上下文相同,所以,如果共享不起作用,我不应该在那个时候得到正确的内容。
qt5.5 - 移植到 Qt5.6 或高级会导致应用程序使用 ANGLE 而不是 OpnelGL 3.x 并导致黑屏而不是渲染实际图像
我最近将我们的应用程序从 Qt5.5 移植到了 Qt5.12.1。在 i5 处理器 Windows 10 上,应用程序运行良好。然而,在 i3 Windows 10 Pc 上,我们得到的只是黑屏。该应用程序在 i3 Windows 8 上运行良好。
在进一步挖掘中,我们发现该问题仅出现在 OpenGL 版本为 3.x 的设备上,并且在 OpenGL 版本为 4.0+ 时才有效。这就是为什么它在具有 4.0 版本 OpenGL 的 i3 windows8 中工作的原因。
对于 Qt5.5,它可以工作,但如果我们移植到 Qt5.6,它也不起作用。我们在 Qt 的发行说明或已知错误中找不到任何内容。我们正在使用 OpenGL 函数和 QOpenGlWindow。
来自Qt5.5构建日志的信息: glVersion 3.1.0 - Build 9.17.10.4459
来自Qt5.6 和 5.12.1日志的信息构建在同一台机器和同一环境中: glVersion - OpenGL ES 2.0 (ANGLE 2.1.0.57ea533f79a7)
我想知道在移植 Qt 版本时是否遗漏了一些我应该做的事情?或者它是Qt中的一个错误?
如何强制 Qt 使用可用的 OpenGL 版本而不是使用 ANGLE?
我还想知道我们是否可以降级 Windows 10 的 OpenGL 版本,以便在其他设备上轻松重新创建它以及用于测试目的。
谢谢你。
python - QOpenGLFunctions.glDrawElements 仅适用于 VoidPtr(0)?
我一直在尝试使用 Qt5QOpenGLFunctions
和QOpenGLExtraFunctions
类来绘制元素,并且我在参数类型方面遇到了很多问题(但我将把其他问题排除在这个特定问题之外)。这个问题与使用有关glDrawElements
,它是(参见此处)“调用 glDrawElements(模式、计数、类型、索引)的便利函数”。在这种情况下的指数(从这里):
将字节偏移量(转换为指针类型)指定到绑定到 GL_ELEMENT_ARRAY_BUFFER 的缓冲区中以开始读取索引。如果没有绑定缓冲区,则指定一个指向存储索引位置的指针。
就我而言,我没有对要访问的索引 (0) 的偏移。我相信None
这里的 Python 相当于一个空指针,但到目前为止,我只有在传入时才成功shiboken2.shiboken2.VoidPtr(0)
,而且我不完全理解为什么,也不知道如何(如果可能的话)这样做以更“pythonic”的方式。
我正在使用 Python3.8、PySide2 和 OpenGL4.1(核心)。
c++ - 在 FBO(QOpenGLFramebufferObject)中使用模板缓冲区时出错
我尝试在这样的 fbo 中绘制凹多边形(这只是正方形中的三角形),并且我在 QOpenGLWidget 中成功绘制了它:
example.png
但是当我想在 FBO 中绘制它并将其转换为图像时保存,结果总是错误(只是一个黑色的图像)。我在启用模板缓冲区的情况下绘制凹多边形,这里是所有代码(<a href="https://www.wenshushu.cn/f/3dyxccyxn6w" rel= "nofollow noreferrer">项目包下载):
主.cpp:
渲染小部件.h:
渲染小部件.cpp:
顶点.vert:
碎片片段:
参考:
Stackoverflow:在 OpenGL 中绘制凹多边形
c++ - 使用 QOpenGLFunctions_3_3_Core 对象关闭应用程序期间出现分段错误
我有应用程序,其中代码的关键部分是:
主文件
其中MainWindow w
使用class GLRendWindow : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
了具有如此重要部分的内容:
着色器.h 是:
Shader.cpp 部分是:
此代码已正确编译和构建。我可以成功运行应用程序,在着色器创建期间没有错误。它还可以正确显示所有内容。在关闭应用程序期间,我在Shader
使用堆栈的析构函数结束后看到分段错误:
Shader
如果不再派生自 ,则不会出现此问题QOpenGLFunctions_3_3_Core
。
我的问题是为什么?
在这种情况下,可能是连接/依赖/其他类派生QOpenGLFunctions_3_3_Core
并调用具有分段错误的析构函数。
是否有可能两种机制试图清理我的着色器?或者可能有强制的方法来清理QOpenGLFunctions_3_3_Core
我在文档中遗漏的所有内容?
c++ - Qt + OpenGL4:glBindVertexArray() 在绘图时创建一个 GL_INVALID_OPERATION
正如标题所示,我正在尝试找出程序中出现错误的原因。glBindVertexArray()
在我的程序中绘制场景时创建一个 GL_INVALID_OPERATION,即使我事先已正确初始化它。
该程序在libQGLViewer库的帮助下使用 Qt 5.15 。它由同一屏幕上的多个 QGLViewer 实例组成,并使用底层Scene
类从多个 Qt 小部件中的相同缓冲区/纹理/VBO 中绘制相同的内容。
该类Scene
继承自QOpenGLFunction_4_0_Core
该类,使其兼容 OpenGL 4.0,因此能够使用 VAO/VBO。问题是:我有几个绘图函数,具体取决于请求绘图的小部件类型。以下是触发 draw 的代码概述:
在我的initGL()
函数中,它唯一做的一件事就是调用该initScene()
函数,该函数检查场景是否已经使用Scene::isInitialized
布尔成员初始化(或开始初始化)(因此场景没有初始化两次)。在initScene()
函数中,我调用this->initializeOpenGLFunctions()
以将 Qt 提供的 OpenGL 函数指针初始化为正确的值,这将允许我稍后在不同的查看器中绘制场景。说到这里,下面是不同绘制函数的代码概述:
没有意义的是,在 VAO 的创建/规范时,句柄是有效的,但在绘图时不再有效!
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
我在创建QMainWindow
/之前确实调用了QApplication
,以便 OpenGL 查看器共享相同的上下文,但这并没有改变任何东西,每次绑定 VAO 时,操作总是返回GL_INVALID_OPERATION
,根据 OpenGL 规范,只有在之前调用glGenVertexArrays()
/没有创建 VAO glBindVertexArrays()
!
我断断续续地尝试了几天来解决这个问题,但我似乎无法解决它。有没有人有过调试 OpenGL/Qt 程序的经验?在帮助论坛上使用 Qt 的最新桌面 OpenGL 版本的人似乎并不多……
c++ - Qt 6.0 版中的 QOpenGLFunctions_4_1_Core 函数错误
我很可能在 Qt 的 6.0 版中遇到了 QOpenGLFunctions_4_1_Core 的一些问题。由于某些原因,QOpenGLFunctions 4.1 函数似乎没有应用在代码的调用函数中,并且完全阻止了代码运行。在 Qt 6.0 版本中,我不得不调用函数 <QtOpenGL/QOpenGLFunctions_4_1_Core> 甚至有办法调用相关部分的代码函数。这是错误的主要原因吗?
错误:在函数“VisualObject::Visual Object”中未定义对“__imp__ZN25QOpenGLFunctions_4_1_CoreC2Ev”的引用
错误:在函数“VisualObject::~Visual Object”中未定义对“__imp__ZN25QOpenGLFunctions_4_1_CoreC2Ev”的引用
错误:未定义对“QOpenGLFunctions_4_1_Core::initializeOpenGLFunctions()”的引用
c++ - 在 Qt 6 中获取 Metal 绘图上下文
使用 Qt OpenGL 后端时,可以使用QQuickWindow::beforeRenderPassRecording
信号在 Qml 场景图渲染期间渲染自定义 OpenGL 代码,如 Qt 文档中所述:https ://doc.qt.io/qt-5/qtquick-scenegraph- openglunderqml-example.html
Apple Metal 后端是否有类似的功能?如何在场景图中使用本机 Metal 代码?