Qt 3D: シンプルなカスタムマテリアルのQML例
Qt 3D でカスタムマテリアルを作成する例です。
この例では、簡単なカスタムマテリアルを作成します。
サンプルを実行する
Qt Creator からサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Example を参照してください。
シーンの指定
この例では、Scene3D を使用して、カスタムマテリアルを使用するシーンをレンダリングします。シーンには、カスタムマテリアルを使用する平面モデルが含まれています。
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) } }
マテリアルの指定
マテリアルはsimplecustommaterial/SimpleMaterial.qml
でMaterial タイプを使用して指定します。まず、マテリアルはパラメータを指定します。このパラメータは、qmlから変更できるように、シェーダーの対応するユニフォームにマッピングされます。
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) } ]
次に、どのシェーダーを読み込むかを指定します。OpenGL ES 2とOpenGLレンダラー用に、別々のバージョンのシェーダーが用意されています。
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"
頂点シェーダでは、単純に変換行列によって位置を変換します。
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); }
フラグメントシェーダでは、フラグメントカラーをマテリアルで指定されたメインカラーに設定します。
uniform vec3 maincolor; void main() { //output color from material fragColor = vec4(maincolor,1.0); }
次に、シェーダからShaderPrograms を作成します。
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) }
最後に、特定のApiプロファイルに対応するTechniquesでシェーダープログラムを使用します。
// OpenGL 3.1 Technique { filterKeys: [forward] graphicsApiFilter { api: GraphicsApiFilter.OpenGL profile: GraphicsApiFilter.CoreProfile majorVersion: 3 minorVersion: 1 } renderPasses: RenderPass { shaderProgram: gl3Shader } },
©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。