Revision control
++ // Copyright (C) 2026 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ // Texture binding in an AugmentMaterial pass.
++ //
++ // The RenderPass carries two Texture properties. Both are declared as samplers
++ // in the generated shader, because the property exists in either case, but
++ // only boundMap resolves to a GPU texture: unboundMap has no source, so
++ // nothing binds it and the pass has to fill it with the engine's dummy texture
++ // to keep the shader resource bindings complete.
++ //
++ // The augment shader samples both and only paints the sphere green if the
++ // bound one still reads its real colour and the unbound one reads the dummy.
++ // Getting that backwards -- filling a sampler that was already bound -- turns
++ // the sphere red.
++
++ import QtQuick
++ import QtQuick3D
++ import QtQuick3D.Helpers
++
++ Item {
++ id: root
++ width: 400
++ height: 400
++
++ View3D {
++ anchors.fill: parent
++ renderOverrides: View3D.DisableInternalPasses
++
++ environment: SceneEnvironment {
++ backgroundMode: SceneEnvironment.Color
++ clearColor: "black"
++ tonemapMode: SceneEnvironment.TonemapModeNone
++ }
++
++ PerspectiveCamera {
++ position: Qt.vector3d(0, 0, 300)
++ }
++
++ RenderPassTexture {
++ id: outputTex
++ format: RenderPassTexture.RGBA8
++ }
++
++ RenderPass {
++ id: mainPass
++ materialMode: RenderPass.AugmentMaterial
++ augmentShader: "augment_texture_binding_augment.glsl"
++ clearColor: "black"
++
++ // Resolves to a real texture.
++ property Texture boundMap: Texture {
++ sourceItem: Rectangle {
++ width: 8
++ height: 8
++ color: "#00ff00"
++ }
++ }
++
++ // Declared, but with no source there is no GPU texture to bind.
++ property Texture unboundMap: Texture { }
++
++ // Same, but a cube map: the property type stays Texture so the
++ // pass picks it up, while the CubeMapTexture instance is what makes
++ // the generated shader declare a samplerCube. It has to end up with
++ // the dummy cube map, all six faces of it.
++ property Texture unboundCube: CubeMapTexture { }
++
++ commands: [
++ ColorAttachment { target: outputTex },
++ DepthStencilAttachment {}
++ ]
++ }
++
++ SimpleQuadRenderer {
++ texture: Texture {
++ textureProvider: RenderOutputProvider {
++ textureSource: RenderOutputProvider.UserPassTexture
++ renderPass: mainPass
++ attachmentSelector: RenderOutputProvider.Attachment0
++ }
++ }
++ }
++
++ Model {
++ source: "#Sphere"
++ scale: Qt.vector3d(3, 3, 3)
++ materials: PrincipledMaterial {
++ baseColor: "white"
++ lighting: PrincipledMaterial.NoLighting
++ }
++ }
++ }
++ }