【发布时间】: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作为答案。