簡體   English   中英

Qt3d / C ++-如何使用frameGraphe實現輪廓?

[英]Qt3d/C++ - How to use frameGraphe to achive Outlines?

我制作了一個簡單的查看器,允許您導入.obj文件,我想要實現的是,當用戶選擇模型時,着色器將以不同的顏色繪制模型輪廓。

我用來表示.obj文件的是帶有自定義QMaterial,自定義QPickerObject和QMesh的QEntity。

使用我的自定義QMaterial,我制作了簡單的平面着色 (基於面部法線進行着色)

// My Custom QMaterial : 

explicit CustomizedMaterial(Qt3DCore::QNode *parent = nullptr) : QMaterial(parent)
{
                // Create effect, technique, render pass and shader
                Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
                Qt3DRender::QTechnique *gl3Technique = new Qt3DRender::QTechnique();
                Qt3DRender::QRenderPass *gl3Pass = new Qt3DRender::QRenderPass();
                Qt3DRender::QShaderProgram *glShader = new Qt3DRender::QShaderProgram();

        QByteArray ver(
                    "#version 330\n"

                    "out vec3 vViewPos;\n"

                    "in vec3 vertexPosition;\n"
                    "in vec3 vertexNormal;\n"

                    "uniform mat4 modelView;\n"
                    "uniform mat3 modelViewNormal;\n"
                    "uniform mat4 mvp;\n"

                    "void main()\n"
                    "{\n"
                        "vec4 pos = vec4(vertexPosition, 1.0);\n"
                        "vec4 mpos = modelView * pos;\n"
                        "gl_Position = mvp * vec4(vertexPosition, 1.0);\n"
                        "vViewPos = -mpos.xyz;\n"
                    "}\n");

            QByteArray frag(
                        "#version 330\n"

                        "vec3 normals(vec3 pos)\n"
                         "{\n"
                           "vec3 fdx = dFdx(pos);\n"
                           "vec3 fdy = dFdy(pos);\n"
                           "return normalize(cross(fdx, fdy));\n"
                         "}\n"

                        "in vec3 vViewPos;\n"
                        "out vec4 fragColor;\n"

                    "void main()\n"
                    "{\n"
                        "vec3 normal = normals(vViewPos);\n"
                        "vec3 gray = vec3(0.9, 0.9, 0.9);\n"
                        "float theta = dot(normal, vec3(0, 0, 1)) / length(normal);\n"
                        "fragColor = vec4(gray * theta , 1.0);\n"
                    "}\n");

        glShader->setVertexShaderCode(ver);
        glShader->setFragmentShaderCode(frag);

        // Set the shader on the render pass
        gl3Pass->setShaderProgram(glShader);

        // filter
        Qt3DRender::QFilterKey *m_filterKey = new Qt3DRender::QFilterKey(this);
        m_filterKey->setName(QStringLiteral("renderingStyle"));
        m_filterKey->setValue(QStringLiteral("forward"));

        // Add the pass to the technique
        gl3Technique->addRenderPass(gl3Pass);

        // Set the targeted GL version for the technique
        gl3Technique->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
        gl3Technique->graphicsApiFilter()->setMajorVersion(3);
        gl3Technique->graphicsApiFilter()->setMinorVersion(2);
        gl3Technique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);

        // Add filter
        gl3Technique->addFilterKey(m_filterKey);

        // Add the technique to the effect
        effect->addTechnique(gl3Technique);

        // Set the effect on the materials
        setEffect(effect);
    }

從我的搜索中,我認為最簡單的方法是使用兩次渲染過程技術,可惜Qt3d / C ++中沒有文檔或示例向我展示如何做,有什么可以幫助的嗎?

提前致謝。

是的,不幸的是,在這方面沒有太多的信息。 看起來Qt在QML上投入了更多的精力和資源,而不是C ++ /所有示例都以5比1支持QML /。 好吧,我設法使自定義着色器工作。 我玩過您的代碼,僅更改了一些:

  1. 創建后,我立即移動了QTechnique的配置,並且更改了該技術的初始化順序:

    gl3Technique-> graphicsApiFilter()-> setProfile(Qt3DRender :: QGraphicsApiFilter :: CoreProfile);

    gl3Technique-> graphicsApiFilter()-> setApi(Qt3DRender :: QGraphicsApiFilter :: OpenGL);

    gl3Technique-> graphicsApiFilter()-> setMajorVersion(3);

    gl3Technique-> graphicsApiFilter()-> setMinorVersion(1);

  2. 我把QFilterKey作為技術

    Qt3DRender :: QFilterKey * filterkey =新的Qt3DRender :: QFilterKey(this);

    filterkey-> setName(QStringLiteral(“ renderingStyle”));;

    filterkey-> setValue(QStringLiteral(“ forward”));

  3. 我以與示例QML代碼所示相同的方式從資源加載着色器:

    glShader-> setVertexShaderCode(Qt3DRender :: QShaderProgram :: loadSource(QUrl(QStringLiteral(“ qrc:/MyShader/simpleColor.vert”)))));;

    glShader-> setFragmentShaderCode(Qt3DRender :: QShaderProgram :: loadSource(QUrl(QStringLiteral(“ qrc:/MyShader/simpleColor.frag”)))));

我沒有調查其中哪個是主要原因,但仍在工作。

之后,我在這篇文章中找到了另一條確認信息-同樣的處理方式

如何使3D對象上的區域顏色與@AdaRaider和@ user3405291不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM