On 9 Jan 2019, at 10:59, Volker Enderlein <volker.enderl...@ifm-chemnitz.de>
wrote:
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)?
<RenderingIssues.PNG>
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