【问题标题】:Disable Anti Aliasing in Qt3D在 Qt3D 中禁用抗锯齿
【发布时间】:2019-08-13 07:58:51
【问题描述】:

我们正在从较旧的 3D 引擎迁移到 Qt 3D。为了将较旧的 3D 引擎与 Qt3D 进行比较,我正在编写一个小应用程序,将两种渲染进行横向比较。

为了使自动比较更合适,我需要在 Qt3D 中停用抗锯齿。

我认为,我必须修改框架图,但我不知道这样做有什么必要。

以下示例应用显示了一个带有球体的简单 Qt3D 场景。有谁知道如何在默认框架图中进行必要的更改?

#include <QApplication>
#include <QVBoxLayout>
#include <QFrame>
#include <Qt3DRender/QCamera.h>
#include <Qt3DExtras/QSphereMesh>
#include <Qt3DExtras/QDiffuseSpecularMaterial>
#include <Qt3DExtras/qforwardrenderer.h>
#include <Qt3DExtras/Qt3DWindow.h>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);

    auto view = new Qt3DExtras::Qt3DWindow();
    auto frameGraph = view->defaultFrameGraph();
    frameGraph->setClearColor(QColor(255,255,255));
    // Disable Anti-Aliasing
    // What is necessary here!
    // ---------------------

    auto rootEntity = new Qt3DCore::QEntity();
    view->setRootEntity(rootEntity);

    auto cameraEntity = view->camera();
    cameraEntity->lens()->setPerspectiveProjection(45.0f, 1., 0.1f, 10000.0f);
    cameraEntity->setPosition(QVector3D(5, 5, 5));
    cameraEntity->setUpVector(QVector3D(0, 1, 0));
    cameraEntity->setViewCenter(QVector3D(0, 0, 0));

    auto mesh = new Qt3DExtras::QSphereMesh();
    mesh->setRadius(1.);

    auto meshMaterial = new Qt3DExtras::QDiffuseSpecularMaterial();
    meshMaterial->setAlphaBlendingEnabled(true);
    meshMaterial->setDiffuse(QColor(50, 50, 50));
    meshMaterial->setAmbient(QColor(255, 255, 255));
    meshMaterial->setSpecular(QColor(255,255,255));
    meshMaterial->setShininess(100);

    auto meshEntity = new Qt3DCore::QEntity(rootEntity);
    meshEntity->addComponent(mesh);
    meshEntity->addComponent(meshMaterial);
    meshEntity->setEnabled(true);

    auto container = QWidget::createWindowContainer(view);
    QFrame frame;
    frame.setLayout(new QVBoxLayout);
    frame.layout()->addWidget(container);

    frame.setFixedSize(500, 500);
    frame.show();
    return a.exec();
}

【问题讨论】:

  • 您确定启用了抗锯齿功能吗?查看this post,您似乎必须将QMultiSampleAntiAliasing class 添加到您的框架图中。
  • @Florian Blume:是的,它已启用。您可以通过运行应用程序来确认。也许这是一种默认行为。
  • 这很奇怪。您应该需要一个多样本节点,但 Qt3DWindow 不会添加一个。也许尝试设置自己的格式(请参阅 GitHub 上的窗口代码如何设置)。
  • @FlorianBlume:您的意思是QWindow 实现?其实我也试过设置格式,但终究没有效果。但是设置setStereo(true) 禁用了抗锯齿。我刚刚发布了这个working solution 作为答案。

标签: c++ qt qt3d


【解决方案1】:

查看multisampleantialiasing 的 Qt 文档 那里有一些示例代码。

编辑:附录

QML Scene3D 具有以下属性

多重采样:布尔

如果请求了多重采样渲染缓冲区,则为真。默认情况下 启用多重采样。如果 OpenGL 实现没有支持 对于多样本渲染缓冲区或帧缓冲区 blit,使用的请求 多重采样被忽略。注意:不要更改值 经常因为它涉及昂贵且可能很慢 初始化帧缓冲区和其他 OpenGL 资源。

但是在 C++ 世界中没有对应的 Scene3D... 大多数 QML 类通过在名称前添加“Q”来对应 C++。但是没有QScene3D。

Qt3DExtras::Qt3DWindow的使用说明

Qt3DWindow 是从 QWindow 派生的,它的创建是为了在不使用 QWidgets 的情况下提供解决方案。你可以阅读更多详情in this post

如果您想在稍后的测试阶段添加按钮、滑块、等...,我建议您使用 QML。与单独使用 C++ 相比,您将从 Qt3D 获得更大的灵活性。甚至可以混合使用 C++ 和 QML:您可以在 C++ 中创建逻辑并在 QML 中注册使用。所以你得到了两全其美。如果我想彻底测试 Qt3D 的功能,我会这样做。

编码愉快!

【讨论】:

    【解决方案2】:

    如果有人偶然发现这一点,我如何在 Qt3D 中启用/禁用抗锯齿是通过设置表面格式的样本数量:

    QSurfaceFormat format;
    format.setSamples(0); // Disables anti-aliasing
    QSurfaceFormat::setDefaultFormat(format);
    
    QSurfaceFormat format;
    format.setSamples(4); // Enables 4x anti-aliasing
    QSurfaceFormat::setDefaultFormat(format);
    

    这必须在设置 Qt3D 之前发生。

    注意:这适用于您想要在默认 Qt3D 场景中禁用/启用抗锯齿功能,即您不渲染到纹理然后在着色器中使用它的情况。如果你想做后者,请查看QMultiSampleAntiAliasing。

    【讨论】:

    • 你又来了。好吧,我并不感到惊讶!
    【解决方案3】:

    以下代码禁用抗锯齿,但绝对不是正确的方法。但是,毕竟我得到了一个可行的解决方案。在QSurfaceFormat 中设置setStereo(true) 会神奇地禁用抗锯齿。

    #include <QApplication>
    #include <QVBoxLayout>
    #include <QFrame>
    #include <Qt3DRender/QCamera>
    #include <Qt3DExtras/QSphereMesh>
    #include <Qt3DExtras/QDiffuseSpecularMaterial>
    #include <Qt3DExtras/qforwardrenderer>
    #include <Qt3DExtras/Qt3DWindow>
    #include <Qt3DRender/QRenderSettings>
    
    void depthFirstTraversal(const Qt3DRender::QFrameGraphNode* node, int depth) {
        auto pad = QString(depth, QChar('\t'));
        qDebug().noquote().nospace() <<  pad << node;
        for (auto iter : node->children()) {
            if (auto frameGraphNode = qobject_cast<Qt3DRender::QFrameGraphNode*>(iter)) {
                depthFirstTraversal(frameGraphNode, depth + 1);
            }       
        }
    }
    
    int main(int argc, char* argv[])
    {
        QSurfaceFormat format;
        format.setStereo(true); // Disables anti-aliasing, but is definitely weird
        QSurfaceFormat::setDefaultFormat(format);
    
        QApplication a(argc, argv);
    
        auto view = new Qt3DExtras::Qt3DWindow();
        auto frameGraph = view->activeFrameGraph();
        depthFirstTraversal(frameGraph, 0);
        view->defaultFrameGraph()->setClearColor(QColor(255,255,255));
    
        auto rootEntity = new Qt3DCore::QEntity();
        view->setRootEntity(rootEntity);
    
        auto cameraEntity = view->camera();
        cameraEntity->lens()->setPerspectiveProjection(45.0f, 1., 0.1f, 10000.0f);
        cameraEntity->setPosition(QVector3D(5, 5, 5));
        cameraEntity->setUpVector(QVector3D(1, 1, 0));
        cameraEntity->setViewCenter(QVector3D(0, 0, 0));
    
        auto mesh = new Qt3DExtras::QSphereMesh();
        mesh->setRadius(1.);
    
        auto meshMaterial = new Qt3DExtras::QDiffuseSpecularMaterial();
        meshMaterial->setAlphaBlendingEnabled(true);
        meshMaterial->setDiffuse(QColor(50, 50, 50));
        meshMaterial->setAmbient(QColor(255, 255, 255));
        meshMaterial->setSpecular(QColor(255,255,255));
        meshMaterial->setShininess(100);
    
        auto meshEntity = new Qt3DCore::QEntity(rootEntity);
        meshEntity->addComponent(mesh);
        meshEntity->addComponent(meshMaterial);
        meshEntity->setEnabled(true);
    
        auto container = QWidget::createWindowContainer(view);
        QFrame frame;
        frame.setLayout(new QVBoxLayout);
        frame.layout()->addWidget(container);
    
        frame.setFixedSize(500, 500);
        frame.show();
        return a.exec();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多