2017-10-06 6 views
0

J'écris une application en utilisant Qt3D. La plupart des manipulations 3D que j'ai faites utilisent QML et non l'interface C++. J'ai créé un effet QML qui charge mes programmes de shaders similaires à l'effet de couleur PerVertex QML fourni avec Qt5.9.Comment activer une fonction GL dans Qt3D avec QML

Le problème que j'ai est que j'essaie d'écrire un fragment shader et d'utiliser glBlendFunc(sfactor, dfactor). Selon la documentation OpenGL, je dois définir glEnable(GL_BLEND) et utiliser glBlendFunc, mais je ne sais pas comment faire cela en utilisant QML. Je peux voir comment cela se fait du côté C++, mais comme j'utilise QML Scene3D, cela nécessiterait beaucoup de réécriture. Quelqu'un peut-il me dire comment activer les fonctions OpenGL (comme GL_BLEND) via Qt3D QML?

Comme demandé, le 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); 
} 

Voici également le composant Effet:

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

où avez-vous lu 'glBlendFunc' est une fonction qui peut être utilisé à l'intérieur d'un fragment shader? Ou ai-je mal lu cela et vous l'appelez ouside du shader? – PeterT

+0

Pouvons-nous voir votre code shader? S'il vous plaît. – Rabbid76

+0

Ajout de code shader –

Répondre

1

L'appel de la glBlendFunc est directement impossible dans Qt3D. Vous devez définir la propriété renderStates de votre RenderPass. Il devrait être quelque chose de semblable à cela, selon la fonction de mélange et d'autres états que vous souhaitez activer:

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