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

Cin*_*its 4 opengl qt qml qt3d

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

我遇到的问题是我正在尝试编写片段着色器并加以利用glBlendFunc(sfactor, dfactor)。根据OpenGL文档,我需要设置glEnable(GL_BLEND)和使用glBlendFunc,但是我不知道如何使用QML进行操作。我可以看到它在C ++方面是如何完成的,但是当我使用QML Scene3D时,将需要大量重写才能完成。谁能告诉我如何GL_BLEND通过Qt3D QML 启用OpenGL功能(例如)?

根据要求,片段着色器:

#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 );
}
Run Code Online (Sandbox Code Playgroud)

这也是效果组件:

import Qt3D.Core 2.0
import Qt3D.Render 2.0

Effect {
    id: root

parameters: [
    Parameter { name: "k";         value: Qt.vector3d( 0.1, 0.1, 0.1 )    },
    Parameter { name: "kd";        value: Qt.vector3d( 0.7, 0.7, 0.7 )    },
    Parameter { name: "ks";        value: Qt.vector3d( 0.95, 0.95, 0.95 ) },
    Parameter { name: "shininess"; value: 150.0                           }
]

techniques: [
    Technique {
        graphicsApiFilter {
            api: GraphicsApiFilter.OpenGL
            profile: GraphicsApiFilter.CoreProfile
            majorVersion: 3
            minorVersion: 1
        }

        filterKeys: [ FilterKey { name: "renderingStyle"; value: "forward" } ]

        parameters: [
            Parameter { name: "light.position";  value: Qt.vector4d( 0.0, 0.0, 0.0, 1.0 ) },
            Parameter { name: "light.intensity"; value: Qt.vector3d( 1.0, 1.0, 1.0 )      }
        ]

        renderPasses: [
            RenderPass {
                filterKeys: [ FilterKey { name: "pass"; value: "forward" } ]

                shaderProgram: ShaderProgram {
                    vertexShaderCode:   loadSource("qrc:/shaders/thermal.vert")
                    fragmentShaderCode: loadSource("qrc:/shaders/thermal.frag")
                }
            }
        ]
    }
]
}
Run Code Online (Sandbox Code Playgroud)

dra*_*gly 5

glBlendFunc在Qt3D中不可能直接调用Direct。您需要设置renderStatesRenderPass 的属性。它应该与此类似,这取决于要启用的混合功能和其他状态:

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")
        }
    }
]
Run Code Online (Sandbox Code Playgroud)