如何使用QML在Qt3D中启用GL功能

时间:2017-10-06 18:59:13

标签: qt opengl qml qt3d

我正在使用Qt3D编写应用程序。我一直在做的大多数3D处理都使用QML而不是C ++接口。我已经创建了一个QML效果,可以加载我的着色器程序,类似于Qt5.9附带的PerVertex颜色效果QML。

我遇到的问题是我正在尝试编写片段着色器并使用<Route path="/foo" render={(props) => <div> <SplitView> <ContainerA {...props} /> </SplitView> <Header /> <SplitView> <ContainerC {...props} /> </SplitView> </div> }} /> 。根据OpenGL文档,我需要设置glBlendFunc(sfactor, dfactor)并使用glEnable(GL_BLEND),但我不知道如何使用QML。我可以看到它是如何在C ++方面完成的,但是当我使用QML Scene3D时,需要进行大量的重写才能完成。谁能告诉我如何通过Qt3D QML启用OpenGL功能(如glBlendFunc)?

根据要求,片段着色器:

GL_BLEND

这也是效果组件:

#version 330 core

// TODO: Replace with a struct
uniform vec3 ka;            // Ambient reflectivity
uniform vec3 kd;            // Diffuse reflectivity
uniform vec3 ks;            // Specular reflectivity
uniform float shininess;    // Specular shininess factor
uniform float alpha;

uniform vec3 eyePosition;

in vec3 worldPosition;
in vec3 worldNormal;
in vec3 color;

out vec4 fragColor;

#pragma include light.inc.frag

void main()
{
    vec3 diffuseColor, specularColor;
    adsModel(worldPosition, worldNormal, eyePosition, shininess, diffuseColor, specularColor);
    fragColor = vec4( ka * color + kd * color * diffuseColor + ks * color * specularColor, 1.0 );
}

1 个答案:

答案 0 :(得分:2)

在Qt3D中无法直接调用glBlendFunc。您需要设置RenderPass的renderStates属性。它应该与此类似,具体取决于您要启用的混合功能和其他状态:

renderPasses: [
    RenderPass {
        filterKeys: [ FilterKey { name: "pass"; value: "forward" } ]
        renderStates: [
            CullFace { mode : CullFace.Back },       
            DepthTest { depthFunction: DepthTest.Less },         
            NoDepthMask { },         
            BlendEquationArguments {         
                sourceRgb: BlendEquationArguments.SourceAlpha        
                destinationRgb: BlendEquationArguments.OneMinusSourceAlpha       
            },
            BlendEquation {blendFunction: BlendEquation.Add}
        ]

        shaderProgram: ShaderProgram {
            vertexShaderCode:   loadSource("qrc:/shaders/thermal.vert")
            fragmentShaderCode: loadSource("qrc:/shaders/thermal.frag")
        }
    }
]