Hi,
I am facing some rendering issues with custom effects in Qt3d. To mark
some of the entities selected I replace the existing material effect of
an entity with a newly created instance of a wireframe effect. When
using the robustwireframe shaders sometimes (but not always, it does not
seem to be reproducible) on some entities the underlying color (phong
shading model) is not set properly.
I tried different shaders (also tried to set the fragment color
directly) but the result does not change: sometimes I see those
rendering issues.
And in some cases the following message is written to the console:
QPainter::begin: Paint device returned engine == 0, type: 3
QPainter::setCompositionMode: Painter not active
QPainter::end: Painter not active, aborted
So I'm guessing, setting the custom QEffect causes some issues.
My question is: Should I avoid creating many instances of a custom
wireframe effect and reuse one instance for all selected entities or
should I create a separate instance for every entity (material)?
The left part of the image shows the wrong behaviour, the right part is
the expected rendering.
Platform specs: Windows 7 x64, Visual Studio 2015, Qt 5.10.0, Qt3D
Graphics specs: NVidia GeForce GTX 750 Ti/PCIe/SSE2, OpenGL 4.6.0 NVIDIA
391.35
The definition of the effect is as follows:
WireFrameEffect::WireFrameEffect(Qt3DCore::QNode* parent/* = nullptr*/)
: Qt3DRender::QEffect(parent)
{
addParameter(new Qt3DRender::QParameter(QStringLiteral("ka"),
QVector4D(0.1f, 0.1f, 0.1f, 1.0f)));
addParameter(new Qt3DRender::QParameter(QStringLiteral("kd"),
QVector4D(0.7f, 0.7f, 0.7f, 1.0f)));
addParameter(new Qt3DRender::QParameter(QStringLiteral("ks"),
QVector4D(0.95f, 0.95f, 0.95f, 1.0f)));
addParameter(new Qt3DRender::QParameter(QStringLiteral("ke"),
QVector4D(0.0f, 0.0f, 0.0f, 1.0f)));
addParameter(new
Qt3DRender::QParameter(QStringLiteral("shininess"), 128.0f));
addParameter(new
Qt3DRender::QParameter(QStringLiteral("light.position"), QVector4D(0.0f,
0.0f, 0.0f, 1.0f)));
addParameter(new
Qt3DRender::QParameter(QStringLiteral("light.intensity"),
QVector3D(1.0f, 1.0f, 1.0f)));
addParameter(new
Qt3DRender::QParameter(QStringLiteral("line.width"), 1.0f));
addParameter(new
Qt3DRender::QParameter(QStringLiteral("line.color"), QVector4D(1.0f,
1.0f, 1.0f, 1.0f)));
auto technique = new Qt3DRender::QTechnique;
{
auto graphicsApiFilter = technique->graphicsApiFilter();
graphicsApiFilter->setApi(Qt3DRender::QGraphicsApiFilter::Api::OpenGL);
graphicsApiFilter->setProfile(Qt3DRender::QGraphicsApiFilter::OpenGLProfile::CoreProfile);
graphicsApiFilter->setMajorVersion(3);
graphicsApiFilter->setMinorVersion(1);
auto filterKey = new Qt3DRender::QFilterKey;
filterKey->setName(QStringLiteral("renderingStyle"));
filterKey->setValue(QStringLiteral("forward"));
technique->addFilterKey(filterKey);
auto renderPass = new Qt3DRender::QRenderPass;
{
auto shaderProgram = new Qt3DRender::QShaderProgram;
shaderProgram->setVertexShaderCode(shaderProgram->loadSource(QUrl(QStringLiteral("qrc:/shaders/robustwireframe.vert"))));
shaderProgram->setGeometryShaderCode(shaderProgram->loadSource(QUrl(QStringLiteral("qrc:/shaders/robustwireframe.geom"))));
shaderProgram->setFragmentShaderCode(shaderProgram->loadSource(QUrl(QStringLiteral("qrc:/shaders/robustwireframe.frag"))));
renderPass->setShaderProgram(shaderProgram);
}
technique->addRenderPass(renderPass);
}
addTechnique(technique);
}
Thanks in advance,
Cheers Volker
--
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest