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 의 인스턴스 세 개가 생성되어 렌더링된 G-버퍼 텍스처에 대한 참조를 제공하며, 이는 후속 조명 패스에서 사용됩니다.
G-버퍼 패스의 layerMask 속성은 ContentLayer.Layer0 및 ContentLayer.Layer1에 있는 오브젝트만 렌더링하도록 설정됩니다. 따라서 layers 속성을 적절히 설정하여 G-버퍼 패스에서 렌더링되는 오브젝트를 제어할 수 있습니다.
디퍼드 조명 패스
두 번째 사용자 지정 렌더 패스는 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 모델은 lighting.vert 및 lighting.frag 파일에 정의된 버텍스 및 프래그먼트 셰이더와 함께 CustomMaterial 을 사용합니다. CustomMaterial 에는 셰이더에 G-버퍼 텍스처를 전달하는 데 사용되는 세 개의 TextureInput 프로퍼티가 있습니다.
deferredLightingPass RenderPass 은 View3D 의 메인 컬러 텍스처에 전체 화면 쿼드를 렌더링합니다. RenderablesFilter 을 사용하여 deferredLightingQuad 모델이 배치된 ContentLayer.Layer13 의 오브젝트만 렌더링합니다.
화면에 렌더링하기
마지막으로 커스텀 렌더 패스의 결과를 화면에 표시하려면 View3D 의 메인 컬러 텍스처가 디퍼드 조명 패스의 결과로 업데이트되도록 해야 합니다.
SimpleQuadRenderer { texture: Texture { textureProvider: mainColorTextureProvider } } RenderPassTexture { id: mainColorTexture format: RenderPassTexture.RGBA16F } RenderOutputProvider { id: mainColorTextureProvider textureSource: RenderOutputProvider.UserPassTexture renderPass: deferredLightingPass attachmentSelector: RenderOutputProvider.Attachment0 }
여기서는 deferredLightingPass 에서 제공하는 텍스처를 사용하여 View3D 의 메인 컬러 텍스처를 렌더링하는 데 SimpleQuadRenderer가 사용됩니다.
이것은 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.