gpt4 book ai didi

c++ - 不同的QT widgets只获取一个QOpenGLContext

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:49 28 4
gpt4 key购买 nike

我有以下问题:

我想要一个由许多 View 组成的应用程序,这些 View 从不同的视角、照明和其他选项渲染一个常见的 OpenGL 场景。

基本上,我的问题是用 qt 做到这一点的最佳方法是什么?

我的第一次尝试是创建多个 QOpenGLWidget 并获得一个通用的 QOpenGLContext,我在其中存储纹理以及网格和着色器。但它不适用于网格,因为顶点数组对象似乎不可共享。经过多次尝试,一个可能的解决方案是为每个需要网格的小部件存储一个 VAO,但这看起来非常糟糕。

所以,我想知道是否有解决此类问题的好方法,或者是否有很好的文档来了解这些 QOpenGLContext 的工作原理。

我想象的最简单的想法是只创建一个 QOpenGLContext 并在不同的小部件中使用它。但是我不知道如何单独创建一个 QOpenGLContext,也不知道什么样的 QWidgets 能够显示这些效果图。

这是我的第一篇文章,所以我不知道它是否足够清楚,或者我是否需要描述我的整个架构。

最佳答案

你已经尝试过了,所以我要传递有关共享上下文的信息。

OpenGL 上下文绑定(bind)到一个窗口:如果您只需要一个上下文,直接的答案是只有一个窗口。

使用小部件模块,您可以在同一个 QOpenGLWidget 中使用多个视口(viewport)获得同一场景的多个 View 。像这样的东西:

void myWidget::paintGL() {
//...

glViewport(
0, 0,
this->width()/2, this->height()/2
);

// draw scene from one point of view

glViewport(
this->width()/2, this->height()/2,
this->width()/2, this->height()/2
);

// draw scene from an other point of view

//...
}

您可能应该设计一个视口(viewport)类来存储和管理每个视口(viewport)的渲染参数。

缺点是您必须检测用户在哪个视口(viewport)中单击以处理交互:某种 if event.pos.x 介于 0 和 this->width()/2 ...


另一种方法可能是放下小部件模块并使用 Qt Quick 和 QML:快速窗口声明一个唯一的 OpenGL 上下文,其中每个快速项目都像一个视口(viewport),但封装在它自己的对象中,因此您不需要必须考虑用户在哪里进行交互。

继承 QQuickItem 而不是 QOpenGLWidget 并使用 qmlRegisterType() 宏将您的类导出到 QML。然后您可以在您的程序中创建一个 QQuickView 以加载您声明项目的 QML 代码。 Qt 文档中的示例 here .

关于c++ - 不同的QT widgets只获取一个QOpenGLContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39102106/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com