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")
}
}
]
}
]
}
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
Pouvons-nous voir votre code shader? S'il vous plaît. – Rabbid76
Ajout de code shader –