Sur cette page

Qt Quick 3D - Exemple de matériau de ciel

Démonstration du rendu procédural du ciel et de l'éclairage basé sur des images avec SkyMaterial.

Ciel atmosphérique généré de manière procédurale à l'aide de sphères PBR reflétant l'environnement

Cet exemple montre comment utiliser ` SkyMaterial ` pour générer un ciel procédural et utiliser la cubemap obtenue comme sonde de lumière pour l'éclairage basé sur l'image (IBL) sur les matériaux PBR de la scène.

L’assistant « AdvancedSky » est une sous-classe de ` SkyMaterial ` qui implémente un modèle de diffusion atmosphérique basé sur la physique, conformément à l’article de Hillaire intitulé « A Scalable and Production Ready Sky and Atmosphere Rendering Technique » (2020), avec des aérosols, de l’ozone, une altitude de l’œil et des nuages volumétriques générés par ray-marching configurables.

Configuration de la scène

L’application utilise « ApplicationWindow » avec un « View3D » occupant toute la fenêtre. Un panneau de paramètres se superpose au bord gauche et s’affiche ou se masque lorsque l’on clique sur le bouton bascule. Les importations QtQuick3D pertinentes sont les suivantes :

import QtQuick
import QtQuick.Controls

import QtQuick3D
import QtQuick3D.Helpers

Définition du matériau « Sky »

AdvancedSky est déclaré à l’intérieur de l’ View3D afin de partager la même Node d’ skyLight (le soleil) :

AdvancedSky {
    id: advancedSky
    skyLight: sun
}

AdvancedSky est une sous-classe de ` SkyMaterial ` définie dans ` AdvancedSky.qml`. Ses propriétés QML sont automatiquement transmises sous forme d’uniformes au shader de fragment.

Éclairage basé sur l’image

L’affectation du matériau « sky » à SceneEnvironment::skyMaterial utilise la carte cubique (cubemap) générée de manière procédurale à la fois comme arrière-plan visible et comme source d’éclairage basé sur une image pour les matériaux PBR de la scène :

environment: SceneEnvironment {
    backgroundMode: SceneEnvironment.SkyMaterial
    skyMaterial: advancedSky
    probeExposure: 0.25
    tonemapMode: SceneEnvironment.TonemapModeAces
}

La sphère la plus lisse de la démo reflète le ciel procédural de manière presque parfaite ; les sphères plus rugueuses présentent des reflets progressivement flous, générés par la chaîne de préfiltres GGX d’ SkyMaterial appliquée à la carte cubique procédurale.

Choix du mode de rendu du ciel

skyboxMode permet de sélectionner ce qu’ SkyMaterial produit pour l’arrière-plan visible, indépendamment du cube IBL utilisé pour les reflets :

  • SkyMaterial.Cubemap échantillonne la carte cubique de radiance (le même cube que celui utilisé pour l’éclairage basé sur l’image) ; ainsi, pour un ciel statique, le cube est rendu une seule fois, puis échantillonné à moindre coût à chaque image. La netteté de l’arrière-plan est plafonnée à radianceMapSize. C’est le coût par image le plus faible lorsque seule la caméra se déplace.
  • Les modes « ScreenSpace » évaluent le shader du ciel directement à l’écran à chaque image — à pleine résolution, à la moitié ou au quart de la résolution par axe. Ils dissocient l’arrière-plan visible du cube IBL, offrant un ciel net dans des conditions dynamiques (soleil en mouvement, nuages volumétriques animés) au prix d’un rendu par image. Les échelles plus faibles privilégient la vitesse au détriment de la netteté.

Modifiez la liste déroulante « Mode Skybox » dans le panneau des paramètres pour comparer les options en temps réel : les modes « cubemap » restent peu gourmands en ressources mais adoucissent l’image à mesure que le soleil et les nuages se déplacent, tandis que les modes « screen-space » suivent chaque changement avec précision.

Gestion du budget d’images

iblRenderFrames répartit le préfiltre IBL sur plusieurs images : la même irradiance totale est intégrée de manière incrémentielle, une tranche par image, jusqu’à convergence. La valeur par défaut de « 0 » exécute l’accumulation d’échantillons, la normalisation et l’ iblSampleCount en une seule image. Une valeur plus élevée amortit le coût du préfiltre, ce qui permet à la scène de rester réactive lorsque le nombre d’échantillons IBL est élevé.

Animation du soleil

Une FrameAnimation fait aller et venir le soleil le long de l’horizon lorsque l’option « Animate sun » est activée. Chaque changement de position du soleil invalide l’accumulateur IBL, mais si la valeur de iblRenderFrames est correctement définie, le coût du préfiltre est réparti sur plusieurs images et aucune image ne supporte à elle seule la totalité de ce coût.

FrameAnimation {
    id: sunAnimator
    running: settingsPane.animateSun

    property real t: 0
    property real lastT: 0
    property int direction: 1

    onTriggered: {
        const min = -180
        const max = 0
        lastT = t
        t += direction * frameTime * settingsPane.sunSweepSpeed
        sun.eulerRotation.x = min + (Math.sin(t) * 0.5 + 0.5) * (max - min)
    }

    function updatePhaseFromSun() {
        const min = -180
        const max = 0
        let norm = Math.max(0.0, Math.min(1.0, (sun.eulerRotation.x - min) / (max - min)))
        t = Math.asin(norm * 2.0 - 1.0)
        direction = lastT < t ? 1 : -1
    }
}

Panneau de paramètres

Le panneau de paramètres s’affiche et se masque au-dessus de l’ View3D, à l’aide du bouton situé dans le coin supérieur gauche de la fenêtre d’affichage. Il est divisé en deux groupes.

Ciel

Commandes permettant de définir l'apparence du ciel et des nuages.

  • Animer le soleil — effectue un balayage du soleil en va-et-vient à l’horizon.
  • Vitesse du cycle — vitesse de balayage de l’animation du soleil.
  • Élévation du soleil — position manuelle du soleil en degrés (0° = aube, 90° = midi, 180° = crépuscule).
  • Activer les nuages — active ou désactive les nuages volumétriques générés par ray tracing.
  • Couverture nuageuse — proportion du ciel recouverte par les nuages (0 = ciel dégagé, 1 = ciel couvert).
  • Animer le vent — fait dériver la texture de bruit des nuages à chaque image, invalidant en continu l’accumulateur IBL — un test de résistance utile pour les contrôles du budget d’images.
Rendu

Commandes qui correspondent directement aux propriétés de la classe de base d’ SkyMaterial.

La caméra réagit aux commandes de navigation standard d'WasdController: touches W/A/S/D et glissement de la souris pour regarder autour de soi. Appuyez sur la fenêtre d'affichage pour y placer le focus du clavier.

Exemple de projet sur code.qt.io

Voir également SkyMaterial et SceneEnvironment.

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