首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Qt3D中禁用消除锯齿

在Qt3D中禁用消除锯齿
EN

Stack Overflow用户
提问于 2019-08-13 15:58:52
回答 3查看 540关注 0票数 1

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

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

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

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

代码语言:javascript
复制
#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();
}
EN

回答 3

Stack Overflow用户

发布于 2019-08-13 21:35:49

看看multisampleantialiasing的Qt文档,里面有一些示例代码。

编辑:附录

QML Scene3D具有以下属性

布尔多样本:

如果请求多采样渲染缓冲区,则为true。默认情况下,多重采样处于启用状态。如果OpenGL实现不支持多采样渲染缓冲区或帧缓冲区blits,则会忽略使用多重采样的请求。注意:避免频繁更改该值,因为这会涉及昂贵且可能较慢的帧缓冲区和其他OpenGL资源的初始化。

但是在C++世界中还没有与之对应的Scene3D ...大多数QML类通过在名称前面添加一个"Q“来与C++相对应。但是没有QScene3D。

Qt3DExtras::Qt3DWindow用法备注

Qt3DWindow是从QWindow派生而来的,其创建目的是在不使用QWidgets的情况下提供解决方案。您可以阅读有关详细信息in this post的更多信息

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

祝你编码愉快!

票数 2
EN

Stack Overflow用户

发布于 2019-08-14 16:03:06

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

代码语言:javascript
复制
#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();
}
票数 1
EN

Stack Overflow用户

发布于 2020-09-09 16:41:53

如果有人偶然发现了这一点,我可以通过设置表面格式上的样本数量来启用/禁用Qt3D中的反序列化:

代码语言:javascript
复制
QSurfaceFormat format;
format.setSamples(0); // Disables anti-aliasing
QSurfaceFormat::setDefaultFormat(format);
代码语言:javascript
复制
QSurfaceFormat format;
format.setSamples(4); // Enables 4x anti-aliasing
QSurfaceFormat::setDefaultFormat(format);

这必须在设置Qt3D之前完成。

NB:这适用于在默认Qt3D场景中禁用/启用抗锯齿时,即不渲染到纹理然后在着色器中使用它的情况。如果您想执行后一种操作,请查看QMultiSampleAntiAliasing

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57473478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档