2017-10-06 2 views
0

Ich schreibe eine Anwendung mit Qt3D. Die meiste 3D-Bearbeitung, die ich gemacht habe, hat QML verwendet, nicht die C++ - Schnittstelle. Ich habe einen QML-Effekt erstellt, der meine Shader-Programme ähnlich wie der mit Qt5.9 mitgelieferte PerVertex-Farbeffekt-QML lädt.Wie aktivieren Sie eine GL-Funktion in Qt3D mit QML

Das Problem, das ich habe, ist ich versuche, einen Fragment-Shader zu schreiben und glBlendFunc(sfactor, dfactor) zu verwenden. Laut der OpenGL-Dokumentation muss ich glEnable(GL_BLEND) setzen und glBlendFunc verwenden, aber ich weiß nicht, wie man das mit QML macht. Ich kann sehen, wie es auf der C++ - Seite der Dinge gemacht wird, aber da ich QML Scene3D verwende, würde das sehr viel Umschreiben erfordern. Kann mir jemand sagen, wie OpenGL-Funktionen (wie GL_BLEND) über Qt3D QML zu aktivieren?

Wie gewünscht, die Fragment-Shader:

#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); 
} 

Hier ist auch die Wirkung Komponente:

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") 
       } 
      } 
     ] 
    } 
] 
} 
+0

wo haben Sie gelesen, dass 'glBlendFunc' eine Funktion ist, die in einem Fragment-Shader verwendet werden können? Oder habe ich das falsch verstanden und du nennst es außerhalb des Shaders? – PeterT

+0

Können wir Ihren Shader-Code sehen? Bitte. – Rabbid76

+0

Hinzugefügt Shader-Code –

Antwort

1

Aufruf die glBlendFunc ist direkt nicht möglich in Qt3D. Sie müssen die Eigenschaft renderStates Ihres RenderPass festlegen. Es sollte etwas ähnlich wie diese, je nachdem, welche Vermischungsfunktion und andere Staaten Sie wollen aktivieren:

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") 
     } 
    } 
]