Qt 3D: Einfaches benutzerdefiniertes Material QML-Beispiel
Demonstriert die Erstellung eines benutzerdefinierten Materials in Qt 3D.
Dieses Beispiel demonstriert die Erstellung eines einfachen benutzerdefinierten Materials.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Angeben der Szene
Das Beispiel verwendet Scene3D zum Rendern einer Szene, in der das benutzerdefinierte Material verwendet wird. Die Szene enthält ein Ebenenmodell, das das benutzerdefinierte Material verwendet.
Entity { id: root components: [transform, mesh, material] SimpleMaterial { id: material maincolor: "red" } Transform { id: transform rotationX: 45 } PlaneMesh { id: mesh width: 1.0 height: 1.0 meshResolution: Qt.size(2, 2) } }
Festlegen des Materials
Das Material wird in simplecustommaterial/SimpleMaterial.qml
mit dem Typ Material angegeben. Das Material gibt zunächst Parameter an, die auf die entsprechenden Uniformen in den Shadern abgebildet werden, so dass sie in der qml geändert werden können.
property color maincolor: Qt.rgba(0.0, 0.0, 0.0, 1.0) parameters: [ Parameter { name: "maincolor" value: Qt.vector3d(root.maincolor.r, root.maincolor.g, root.maincolor.b) } ]
Als nächstes wird festgelegt, welche Shader geladen werden. Für OpenGL ES 2 und OpenGL-Renderer werden getrennte Versionen der Shader bereitgestellt.
property string vertex: "qrc:/shaders/gl3/simpleColor.vert" property string fragment: "qrc:/shaders/gl3/simpleColor.frag" property string vertexRHI: "qrc:/shaders/gl45/simpleColor.vert" property string fragmentRHI: "qrc:/shaders/gl45/simpleColor.frag" property string vertexES: "qrc:/shaders/es2/simpleColor.vert" property string fragmentES: "qrc:/shaders/es2/simpleColor.frag"
Im Vertex-Shader transformieren wir einfach die Position durch die Transformationsmatrizen.
void main() { // Transform position, normal, and tangent to world coords worldPosition = vec3(modelMatrix * vec4(vertexPosition, 1.0)); // Calculate vertex position in clip coordinates gl_Position = mvp * vec4(worldPosition, 1.0); }
Im Fragment-Shader setzen wir einfach die Fragmentfarbe auf die im Material angegebene Hauptfarbe.
uniform vec3 maincolor; void main() { //output color from material fragColor = vec4(maincolor,1.0); }
Als nächstes erstellen wir ShaderPrograms aus den Shadern.
ShaderProgram { id: gl3Shader vertexShaderCode: loadSource(parent.vertex) fragmentShaderCode: loadSource(parent.fragment) } ShaderProgram { id: es2Shader vertexShaderCode: loadSource(parent.vertexES) fragmentShaderCode: loadSource(parent.fragmentES) } ShaderProgram { id: rhiShader vertexShaderCode: loadSource(parent.vertexRHI) fragmentShaderCode: loadSource(parent.fragmentRHI) }
Schließlich werden die Shader-Programme in den Techniques verwendet, die einem bestimmten Api-Profil entsprechen.
// OpenGL 3.1 Technique { filterKeys: [forward] graphicsApiFilter { api: GraphicsApiFilter.OpenGL profile: GraphicsApiFilter.CoreProfile majorVersion: 3 minorVersion: 1 } renderPasses: RenderPass { shaderProgram: gl3Shader } },
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.