2017-10-06 8 views
0

Qt3Dを使用してアプリケーションを作成しています。私が行ってきた3D処理の大部分は、C++インターフェイスではなくQMLを使用しています。私は、Qt5.9に同梱されているPerVertexカラーエフェクトQMLに似たシェイダープログラムをロードするQMLエフェクトを作成しました。QMLを使用してQt3DでGL関数を有効にするには

私が抱えている問題は、フラグメントシェーダーを作成してglBlendFunc(sfactor, dfactor)を利用しようとしていることです。 OpenGLのドキュメントによると、glEnable(GL_BLEND)を設定してglBlendFuncを使用する必要がありますが、QMLを使用してそれを行う方法はわかりません。私は物事のC++側でどのように処理されているかを見ることができますが、QML Scene3Dを使用しているので、これを行うには多大な書き換えが必要です。 Qt3D QML経由でOpenGL関数(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); 
} 

ここも効果成分である:直接glBlendFuncを呼び出す

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

ここで、 'glBlendFunc'はフラグメントシェーダ内で使用できる関数だと読んだことがありますか?これは、どのようなブレンド関数やその他の状態を有効にしたいのかによって異なります。それとも私はそれを誤解してしまったのですか?あなたはそれをシェイダーの辺りと呼んでいますか? – PeterT

+0

あなたのシェーダコードを見ることができますか?お願いします。 – Rabbid76

+0

シェーダコードを追加 –

答えて

1

はQt3Dでは不可能です。あなたはRenderPassのプロパティを設定する必要があります。

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") 
     } 
    } 
] 
関連する問題