我们正在从一个较旧的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();
}发布于 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功能,我就会这么做。
祝你编码愉快!
发布于 2019-08-14 16:03:06
下面的代码禁用了抗锯齿,但绝对不是正确的方法。但是,毕竟我找到了一个可行的解决方案。在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();
}发布于 2020-09-09 16:41:53
如果有人偶然发现了这一点,我可以通过设置表面格式上的样本数量来启用/禁用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之前完成。
NB:这适用于在默认Qt3D场景中禁用/启用抗锯齿时,即不渲染到纹理然后在着色器中使用它的情况。如果您想执行后一种操作,请查看QMultiSampleAntiAliasing。
https://stackoverflow.com/questions/57473478
复制相似问题