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

Reply via email to