このページでは

Qt Quick 3D - ユーザーパスの例

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

カスタム・ユーザー・パスを使用してレンダリングされた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 マテリアルによって提供される完全なマテリアルプロパティのサブセットであり、基本的なディファードライティングの実装に必要なプロパティに焦点を当てています。

私たちのRenderPassGBufferPass.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.vertlighting.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 でカスタムユーザーパスを使用する非常に単純化された例です。

サンプルプロジェクト @ code.qt.io

© 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.