Configuration de l'Illumination Globale Précalculée (PRGI)
Lors de la configuration de l'Illumination Globale Précalculée en Temps Réel (PRGI), l'ajustement des paramètres de précalcul (baking) est crucial pour équilibrer la vitesse de génération et la qualité visuelle finale. Les fichiers Lightmap Parameters jouent un rôle central dans cette optimisation.
Pour atténuer les artefacts de couture aux limites des UV, l'option Edge Stitching doit être activée sur la majorité des surfaces, à l'exception de certaines structures spécifiques comme les toitures. La résolution des clusters doit être adaptée à la complexité géométrique : les zones nécessitant une haute fidélité dans le transfert de lumière, telles que les murs courbes ou les surfaces émissives, exigent une Cluster Resolution élevée. Chaque cluster agit comme une unité de stockage pour les données d'éclairage ; une valeur plus élevée augmente la densité des clusters et affine la précision de l'illumination.
Concernant les objets de la scène, une distinction stricte doit être faite entre les éléments entièrement statiques et les éléments dynamiques. Les petits objets statiques peuvent être exclus du précalcul direct et éclairés via des sondes lumineuses (Light Probes), ce qui réduit considérablement le temps de calcul global.
Gestion de l'Émission et Mises à Jour Dynamiques
L'implémentation de l'émission sur les objets dynamiques nécessite une mise à jour explicite de l'illumination globale. L'approche standard consiste à utiliser un MaterialPropertyBlock pour modifier la couleur d'émission au niveau de l'instance, tout en informant le système GI des changements pour les objets statiques environnants.
private void UpdateGlobalIlluminationEmission(Color targetColor, float intensityMultiplier)
{
if (targetRenderer == null)
{
targetRenderer = GetComponentInChildren<Renderer>();
}
if (targetRenderer != null)
{
propertyBlock ??= new MaterialPropertyBlock();
Color finalEmission = targetColor * intensityMultiplier;
propertyBlock.SetColor(Shader.PropertyToID("_EmissionColor"), finalEmission);
targetRenderer.SetPropertyBlock(propertyBlock);
// Met à jour l'illumination globale pour affecter l'environnement statique
DynamicGI.SetEmissive(targetRenderer, finalEmission);
}
}
Il est important de noter que l'appel à DynamicGI.SetEmissive est principalement efficace pour les objets marqués comme statiques dans le système de光照 (Contribute Global Illumination). Pour les maillages purement dynamiques, cette fonction n'aura pas d'impact sur la lumière qu'ils émettent dans l'environnement précalculé.
Génération Procédurale des Sondes Lumineuses
Le placement manuel des sondes lumineuses peut être fastidieux. Une approche programmatique permet de générer des réseaux de sondes structurés, comme des grilles cylindriques ou toroïdales, en calculant les positions et en les assignant au composant LightProbeGroup.
public void BuildProbeNetwork()
{
var probeGroup = GetComponent<LightProbeGroup>();
var probeCoordinates = new List<Vector3>();
var geometricProps = new GeometricProperties(edgeLength);
if (innerRadius <= MIN_INNER_RADIUS_THRESHOLD)
{
BuildCylindricalGrid(geometricProps, outerRadius, totalHeight, verticalLevels, probeCoordinates);
}
else
{
BuildToroidalGrid(geometricProps, outerRadius, innerRadius, totalHeight, verticalLevels, probeCoordinates);
}
probeGroup.probePositions = probeCoordinates.ToArray();
}
Pour obtenir des résultats optimaux, les sondes doivent être positionnées aux endroits où les gradients d'éclairage changent de manière significative. Dans les environnements complexes où le placement manuel est irréalisable, une distribution uniforme ou procédurale offre un compromis acceptable.
Post-Traitement, Effets Visuels et Ciel
L'effet de halo lumineux (Bloom) est géré via la pile de post-traitement plutôt que par le composant Flare hérité, offrant un contrôle plus précis et une meilleure intégration avec le pipeline de rendu moderne. Le ciel procédural prend en charge les transitions jour-nuit, mais le changement de cubemap ne peut pas être déclenché par la simple rotation de la lumière directionnelle ; il nécessite une interpolation personnalisée des matériaux du ciel.
La caméra principale utilise une configuration de post-traitement lourde, incluant plusieurs passes de filtrage anisotropique et d'Ambient Occlusion (AO), ce qui améliore la qualité visuelle mais impacte le budget de performance.
Outils d'Éditeur et Analyse des Performances
Pour faciliter le débogage visuel, des scripts personnalisés peuvent être utilisés pour synchroniser la caméra de la vue Scene avec celle de la vue Game. Cela permet de prévisualiser les effets de post-traitement et les filtres de caméra directement dans l'éditeur. De plus, des utilitaires d'éditeur peuvent être déployés pour scanner la scène et identifier les composants de scripts manquants.
L'analyse des performances révèle un nombre élevé d'appels de dessin (Draw Calls/Batches), souvent autour de 1700 par image. Les réflexions, l'éclairage et les ombres consomment une part significative de ce budget (plus de 1000 batches combinés). Une technique d'atténuation consiste à désactiver l'option Cast Shadows sur les composants MeshRenderer secondaires ou éloignés, bien que cela ne constitue qu'une optimisation marginale face à la charge globale du système d'éclairage.