Qt Quick 3D - ユーザーパスの例
Qt Quick 3D でカスタムレンダーパスを作成する例を示します。

}
ユーザーパスの例では、Qt Quick 3D でカスタムレンダーパスを作成する方法をデモしています。単純化されたディファードライティング技術を実現するために、複数のユーザー定義レンダーパスを使用してレンダリングされた単純な 3D シーンを示しています。
内部レンダーパスの無効化
デフォルトでは、Qt Quick 3D は、3D シーンをレンダリングするために、一連の内部レンダーパスを使用します。これらの内部パスを無効にして、ユーザー定義のレンダーパスを使用して独自のレンダリングパイプラインを実装したい場合があります。
内部レンダーパスを無効にするには、View3D の renderOverrides プロパティをView3D.DisableInternalPasses に設定します。
View3D { id: view3D anchors.fill: parent renderOverrides: View3D.DisableInternalPasses environment: SceneEnvironment { lightProbe: Texture { textureData: ProceduralSkyTextureData { } } backgroundMode: SceneEnvironment.SkyBox }
内部レンダーパスを無効にした場合、View3D のメインカラーパスの結果を提供しないと、画面に何も表示できません。
ジオメトリバッファパス
この例では、最初のカスタムレンダーパスはジオメトリバッファ(G バッファ)パスで、シーン ジオメトリを複数のレンダーターゲットにレンダリングし、各ターゲットに異なるマテリアル プロパティを保存します。提供された例は、Qt Quick 3D マテリアルによって提供される完全なマテリアルプロパティのサブセットであり、基本的なディファードライティングの実装に必要なプロパティに焦点を当てています。
私たちのRenderPass はGBufferPass.qml で定義されています:
RenderPass { id: gbufferPass clearColor: Qt.rgba(0.0, 0.0, 0.0, 0.0) property alias layerMask: filter.layerMask required property RenderPassTexture depthTexture RenderPassTexture { id: gbuffer0 format: RenderPassTexture.RGBA16F // rgb: baseColor (linear), a: metalness } RenderPassTexture { id: gbuffer1 format: RenderPassTexture.RGBA16F // rgb: normal, a: roughness } RenderPassTexture { id: gbuffer2 format: RenderPassTexture.RGBA16F // rgb: emissive, a: ao/spare } commands: [ ColorAttachment { target: gbuffer0; name: "GBUFFER0" }, ColorAttachment { target: gbuffer1; name: "GBUFFER1" }, ColorAttachment { target: gbuffer2; name: "GBUFFER2" }, DepthTextureAttachment { target: gbufferPass.depthTexture }, RenderablesFilter { id: filter renderableTypes: RenderablesFilter.Opaque } ] materialMode: RenderPass.AugmentMaterial augmentShader: "gbuffer_augment.glsl" }
これは3つのカラーアタッチメントと1つのデプスアタッチメントを定義しています。このパスには、RenderPass の内部でRenderPassTexture オブジェクトとして定義されている 3 つのテクスチャが必要です。これらの 3 つの RenderPassTextures は、パスのカラーアタッチメントのターゲットとして使用され、デプスアタッチメントは、パスの外部から提供されるデプステクスチャを使用します。
RenderPass 自体は、AugmentMaterial モードに設定されています。これは、レンダリングされたオブジェクトのマテリアルを、追加のシェーダーコードで補強することを意味します。補強シェーダはgbuffer_augment.glsl ファイルで提供され、必要なマテリアルプロパティを複数のレンダーターゲットに出力します。
void MAIN_FRAGMENT_AUGMENT()
{
vec3 baseColor = BASE_COLOR.rgb;
float metalness = METALNESS;
float roughness = ROUGHNESS;
vec3 worldNormal = normalize(WORLD_NORMAL);
// GBuffer 0: albedo + metalness
GBUFFER0 = vec4(baseColor, metalness);
// GBuffer 1: normal (encoded to 0..1) + roughness
GBUFFER1 = vec4(worldNormal * 0.5 + 0.5, roughness);
// GBuffer 2: world position
GBUFFER2 = vec4(qt_varWorldPos, 1.0);
}ここでは、ベースカラー、メタルネス、ワールドノーマル、ラフネス、ワールドポジションがGバッファの3つのカラーアタッチメントにどのように格納されているかを見ています。
レンダリングパイプラインでGバッファパスを実際に使用するには、Main.qml 、そのインスタンスを作成し、必要な深度テクスチャを提供する必要があります:
RenderPassTexture { id: mainDepthStencilTexture format: RenderPassTexture.Depth24Stencil8 } GBufferPass { id: gbufferPass layerMask: ContentLayer.Layer0 | ContentLayer.Layer1 depthTexture: mainDepthStencilTexture } RenderOutputProvider { id: gbuffer0Provider textureSource: RenderOutputProvider.UserPassTexture renderPass: gbufferPass attachmentSelector: RenderOutputProvider.Attachment0 } RenderOutputProvider { id: gbuffer1Provider textureSource: RenderOutputProvider.UserPassTexture renderPass: gbufferPass attachmentSelector: RenderOutputProvider.Attachment1 } RenderOutputProvider { id: gbuffer2Provider textureSource: RenderOutputProvider.UserPassTexture renderPass: gbufferPass attachmentSelector: RenderOutputProvider.Attachment2 }
RenderPassTexture のインスタンスが 3 つ作成され、レンダリングされた G バッファ テクスチャへの参照が提供されます。
G バッファパスのlayerMask プロパティは、ContentLayer.Layer0 とContentLayer.Layer1 上にあるオブジェクトのみをレンダリングするように設定されています。これにより、layers プロパティを適宜設定することで、Gバッファパスでレンダリングするオブジェクトを制御できます。
ディファード ライティング パス
2番目のカスタムレンダーパスは、Gバッファに保存されたデータを使用してシーンのライティングを計算するディファードライティングパスです。このパスは、G バッファテクスチャをサンプリングし、フラグメントシェーダでライティ ング計算を適用するフルスクリーン・クアッドをレンダリングします。
遅延ライティングパスはMain.qml で次のように定義されています:
Model { id: deferredLightingQuad layers: ContentLayer.Layer13 castsShadows: false receivesShadows: false geometry: PlaneGeometry { // geometry doesn't matter, just need 4 verts plane: PlaneGeometry.XY } materials: [ CustomMaterial { id: lightingPassMaterial property TextureInput gbuffer0: TextureInput { enabled: true texture: Texture { textureProvider: gbuffer0Provider } } property TextureInput gbuffer1: TextureInput { enabled: true texture: Texture { textureProvider: gbuffer1Provider } } property TextureInput gbuffer2: TextureInput { enabled: true texture: Texture { textureProvider: gbuffer2Provider } } shadingMode: CustomMaterial.Unshaded fragmentShader: "lighting.frag" vertexShader: "lighting.vert" } ] } RenderPass { id: deferredLightingPass readonly property Texture gbuffer0: Texture { textureProvider: gbuffer0Provider } readonly property Texture gbuffer1: Texture { textureProvider: gbuffer1Provider } readonly property Texture gbuffer2: Texture { textureProvider: gbuffer2Provider } materialMode: RenderPass.OriginalMaterial commands: [ ColorAttachment { target: mainColorTexture }, DepthStencilAttachment {}, RenderablesFilter { layerMask: ContentLayer.Layer13 } ] }
deferredLightingQuad Model は、lighting.vert とlighting.frag ファイルに定義された頂点シェーダとフラグメントシェーダを持つCustomMaterial を使用します。CustomMaterial には 3 つのTextureInput プロパティがあり、G バッファ テクスチャをシェーダに渡すために使用されます。
deferredLightingPass RenderPass は、View3D のメインカラーテクスチャにフルスクリーン・クアッドをレンダリングします。RenderablesFilter を使用して、ContentLayer.Layer13 上のオブジェクトのみをレンダリングします。これは、deferredLightingQuad Model が配置されている場所です。
スクリーンへのレンダリング
最後に、カスタムレンダーパスの結果をスクリーンに表示するために、View3D'のメインカラーテクスチャがディファードライティングパスの結果で更新されるようにする必要があります。
SimpleQuadRenderer { texture: Texture { textureProvider: mainColorTextureProvider } } RenderPassTexture { id: mainColorTexture format: RenderPassTexture.RGBA16F } RenderOutputProvider { id: mainColorTextureProvider textureSource: RenderOutputProvider.UserPassTexture renderPass: deferredLightingPass attachmentSelector: RenderOutputProvider.Attachment0 }
ここでは、SimpleQuadRendererが、deferredLightingPass によって提供されたテクスチャを使用して、View3D のメインカラーテクスチャをレンダリングするために使用されています。
これは、Qt Quick 3D でカスタムユーザーパスを使用する非常に単純化された例です。
© 2026 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.