问题标签 [qopenglwidget]
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显示ply文件时,发现执行鼠标事件时界面反馈效率低。
c++ - 是否可以有一个带有不透明子工具栏的透明 QMainWindow 和 QOpenGLWidget ?
我想在透明的 QMainWindow 中有一个不透明的 QWidget。QMainWindow 的centralWidget 包含一个垂直布局的QWidget 和一个QOpenGLWidget。QOpenGLWidget 正确绘制,渲染对象不透明,背景透明。但是,QWidget 以部分透明度绘制,这不是我想要的。
此处显示了黑色和红色背景上的应用程序示例:
问题是顶部的 QWidget(带有按钮的工具栏)。这不应该通过它显示红色或黑色,而是显示纯色不透明背景颜色。QOpenGLWidget 应该像当前一样显示红色/黑色。
屏幕截图是在 MainWindow 中使用以下代码截取的:
QOpenGLWidget::paintGL() 包含:
我尝试了对不同小部件的各种调用,但均未成功,包括:
通过将 QWidget 设置为具有 null 父级,将其设置为无框架并手动将其定位在 MainWindow 上,我也已在一定程度上达到了预期的效果。但这是混乱的代码,会导致 Windows 任务栏中显示两个应用程序图标。我不想走这条骇人听闻的路线。
有没有办法通过设置 QWidget 工具栏的正确属性来实现这一点?
更新:可以在这里找到一个最小的代码示例项目: https ://github.com/peguse/TransparentQOpenGLWidgetApp
c++ - QOpenGL 错误:“无效的 VAO/VBO/指针使用”“数组对象未激活”
我目前正在尝试使用 Qt 的 QOpenGL 库来渲染天空盒。为此,我尝试修改 Qt 提供的 QOpenGL“立方体”示例(我使用的是最新的 Qt 5.13 版本)。
顶点和索引缓冲区在名为 的类中初始化GeometryEngine
,其中还定义了顶点和索引数组。在这个例子中,顶点数组有纹理坐标,所以我去掉了这些,只保留了位置坐标,因为关于天空盒纹理的每个操作都将在着色器中完成。
在窗口类中还调用了一个函数initTextures
,我对其进行了修改以加载立方体 6 个面的纹理(虽然我不知道这部分是否正确)。
我还使用以下示例设置了一个 OpenGL 调试记录器:https ://www.trentreed.net/blog/qt5-opengl-part-5-debug-logging/ 。
当我执行代码时,我只得到一个黑屏窗口,没有渲染任何内容以及以下错误消息:
GL_INVALID_OPERATION error generated. Invalid VAO/VBO/pointer usage.
和
GL_INVALID_OPERATION error generated. Array object is not active.
有没有人遇到过这个问题并修复它?因为我认为我没有忘记渲染过程的任何部分。我只修改了输入数据和着色器(但我没有从那部分得到错误)。
首先,我认为问题的核心是由于顶点和索引数组,所以我尝试通过重复顶点数组中每个三角形的顶点来仅使用顶点缓冲区,但我得到了相同的错误消息。
由于我没有收到编译错误,我尝试通过使用#if 0 [...] #endif
每个函数来定位问题,直到没有收到 OpenGL 错误消息。drawCubeGeometry
我最终在类中的方法中隔离了原点GeometryEngine
,其中位置属性被发送到着色器并发出绘制调用。setAttributeBuffer
和调用似乎有问题glDrawElements
,但我无法弄清楚。
我尝试在网上寻找解决方案,但关于 QOpenGL 的问题很少。
在 GeometryEngine.cpp 中:
GLWidget.cpp:
现在我只尝试显示一个红色立方体(在片段着色器中),看看它是否有效。稍后我将专注于应用纹理。
c++ - 我无法在 QOpenGLWidget 上绘画
我是 Qt 的新手,我正在制作一个生成 3D 对象的应用程序,其中包含用户在 GUI 中提供的一些点。用户定义点,然后在同一个窗口中,QOpenGLWidget 绘制最终对象。但是,QOpenGLWindow 不绘制模型(只有 GlCLearColor)。我尝试了相同的功能,但在 main 中的 app.exec() 之前调用了它,它工作正常。
我不知道发生了什么。在使用 vao 和 vbo 之前,我曾尝试调用 makeCurrent() ,但它不起作用。
我还没有创建任何线程,也没有 fbo。
当我在使用 vao 和 vbo 之前尝试 makeCurrent 时,我得到:“QOpenGLBuffer::bind:缓冲区在当前上下文中无效”“QOpenGLShaderProgram::bind:程序在当前上下文中无效。”
编辑我在 vao、vbo 和着色器绑定之前重试了当前状态,并且消息消失了,但小部件没有绘制对象。
绘制后我也尝试过 QOPenGLWidget::update() 。它不会通过调整大小来绘制。我正在使用 OpenGL 4.1 核心配置文件和 Qt 5.12.3
c++ - 如何使用 qopenglwidget 中的线将缓冲区中的一些顶点渲染为点,其余的顶点?
我有一组顶点和法线存储在缓冲区中。我想将大部分顶点显示为点,但我想为剩余的几个顶点画线。这些都存储在一个向量中,点部分在前面,我知道缓冲区的位置,直到它们使用点显示。我也知道每个绘图任务的元素数量。我只使用一个 vao 和一个缓冲区对象来完成这项任务。
我使用以下代码初始化 GLWidget:
函数 setupBuffer() setupVertexAtrribs() 执行与它们的名称相同的任务。顶点布局在缓冲区中,顶点的 xyz 位置后跟其关联法线的 xyz。它们的实现如下
现在,QVector 顶点是传递给 opengl 的缓冲区。这个向量中的最后几个条目是需要使用 GL_LINES 绘制的顶点。
我的paintGL() 函数看起来像这样:
QVector camVertices 是另一个包含需要使用线条绘制的点的向量。camVertices 中的数据在渲染之前附加到向量“Vertices”的末尾。如上面的代码所示,我调用了 glDrawArrays 函数两次——第一次,从缓冲区的 0 索引开始,第二次,从上一次调用结束的位置开始显示剩余的点。
问题是这些点显示得很好。然而,第二次调用仅显示点,但不绘制任何线。
这是显示输出的屏幕截图的链接 - https://drive.google.com/open?id=1i7CjO1qkBALw78KKYGvBteydhfAWh3wh
图片显示了一个显示的示例,其中在顶部外围看到的亮绿色点(许多点的框)是要用线绘制的点。但是,我只看到点而不是任何线。
qt - 添加到 QGraphicsScene 时如何更新 OpenGL 绘图(QOpenGLWidget)?
我的实现基于这个示例。https://doc.qt.io/qt-5/qtopengl-2dpainting-example.html
该示例所做的是渲染/动画 2 个图像。一个使用原生 qt 功能渲染,另一个使用 OpenGL 渲染。这里的所有都是它的。正在绘制的图像完全相同。
该示例工作正常。我可以看到两个图像都有动画。然后,当我尝试通过在 QGraphicsScene 中添加一个 Window 类(包含 QOpenGLWidget)来进行更改时;QOpenGLWidget 停止自我更新。
原始 main.cpp
更改了 main.cpp
这是输出。
完整的源代码可在此处获得。 https://github.com/syaifulnizamyahya/QT2dpainting
c++ - QOpenGLWindow z 顺序问题
我正在为客户更新应用程序。
他们使用 Qt,目前使用 QGLWidget 来显示通过单击相应单选按钮选择的 4 个可能摄像机中的 1 个的全屏视图。然后他们使用 OpenGL 在显示的图像上绘图。这很好用,但他们希望更新 UI 以包含所有 4 个摄像头的四分割视图。
我对如何实现这一点的第一个想法是保留一个 QGLWidget 用于全屏显示,并有 4 个小 QGLWidgets 用于四分割。从文档中我发现您不能重叠 QGLWidgets 或 QOpenGLWidgets,因为它们不能正确处理 z 顺序,但这可以通过使用 QOpenGLWindows 和 QWidget::createWindowContainer 来完成。
所以,我编写了一个应用程序,它使用 QOpenGLWidget(试图使它们更新)作为全屏视图,并使用 QWidget::createWindowContainer 编写了 4 个较小的 QOpenGLWindows,但这也不起作用。
即使我使用 lower() 试图将它们放在全屏 QOpenGLWidget 后面,从 QOpenGLWindows 构建的小部件始终位于顶部。我还尝试在从 QOpenGLWindows 构建的小部件上使用 hide(),但是,这没有任何效果。
python - QT QOpenGLWidget 大小错误
我无计可施。我已经尝试了几天,似乎无法弄清楚我做错了什么。我认为我做错了什么,因为我找不到任何其他对我的问题的引用。当我在 QOpenGLWidget 中覆盖paintEvent 时,即使我在 QT Designer 中将最小和最大高度设置为 48,小部件的大小始终为 (100, 30)。并且对宽度没有限制。这是初始化代码:
这是一些小部件代码:
resizeEvent 在启动时被调用,并且 event.size 的值为 (100, 30),即使调整整个应用程序的大小,它也不会再次被调用。
paintEvent 在启动时被调用并且 event.rect 是 (0, 0, 100, 30)。此事件似乎经常被调用,但大小始终相同。
paintGL 和 resizeGL 永远不会被调用。
我觉得我一定是在做一些明显错误的事情,我希望你们中的一位大师能发现它。
c++ - 如何减少 OpenGL 中的延迟?
我写了一个小应用程序,用手绘光标替换光标。因此我使用了 QOpenGlWidget。对于动画,我使用 frameSwapped 信号:
到目前为止,我没有使用任何特定的 OpenGL 函数,所以我只是将paintevent 模拟覆盖为经典的 QWidget。
当仅使用 QPainter 进行绘图时,也可以像对普通小部件一样进行绘图:通过重新实现 paintEvent()。
我以 240 fps 的速度拍摄了结果,并发现我绘制的光标在 windows 光标后面 2 帧。这并不重要,根本没有滞后。但只有一帧会很棒。如果我能够量化滞后,那就太好了。这样我就知道它是一帧 +- 渲染的持续时间。我已经读过这个,但我对 OpenGL 不太熟悉。而且我认为我不能将它与 QOpenGlWidget 一起使用。也许有人知道如何将延迟减少到只有一帧。
更新 1:我做了一些研究并尝试了很多并取得了一定的成功。我的最新版本:
我使用 glFinish() 来同步 CPU 和 GPU。现在绘制的光标大约落后一帧。有时它甚至比一帧还要好。但是有跳帧,所以绘制的光标根本不动。总体上没有一致性。我仍然很难理解 OpenGL 是如何更新的。也许更多信息:setIntervall
设置为 1 并且它是双缓冲的。我想也许不知道 Qt 究竟做了什么是个问题。调用update
只安排更新,我无法控制缓冲区的交换方式。也许有人在这些问题上有更多的经验。我可以说每 16 毫秒调用一次paintevent/paintGL。我添加了std::this_thread::sleep_for(std::chrono::milliseconds(12));
减少渲染和实际鼠标位置之间的延迟。这有助于减少平均延迟。但对我来说,几乎不可能对下一帧会发生什么做出可靠的预测。
更新 2:我在Qt 论坛 上发布了一个类似的问题。尽管它不是一个直接的答案,但它包含一些有用的信息。