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")
}
}
]
}
]
}
ここで、 'glBlendFunc'はフラグメントシェーダ内で使用できる関数だと読んだことがありますか?これは、どのようなブレンド関数やその他の状態を有効にしたいのかによって異なります。それとも私はそれを誤解してしまったのですか?あなたはそれをシェイダーの辺りと呼んでいますか? – PeterT
あなたのシェーダコードを見ることができますか?お願いします。 – Rabbid76
シェーダコードを追加 –