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")
}
}
]
}
]
}
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
Können wir Ihren Shader-Code sehen? Bitte. – Rabbid76
Hinzugefügt Shader-Code –