Limitations du rendu 3D

Voir aussi

En plus des limitations ci-dessous, les plateformes mobiles ont des limitations supplémentaires sur le rendu 3D comparé aux autres plateformes. Pour plus de détails, voir Limitations du rendu sur mobile.

Introduction

En raison de l'importance qu'ils accordent aux performances, les moteurs de rendu en temps réel présentent de nombreuses limites. Le moteur de rendu de Godot ne fait pas exception à la règle. Pour fonctionner efficacement avec ces limitations, vous devez les comprendre.

Limites de taille des textures

Sur les ordinateurs de bureau et les ordinateurs portables, les textures supérieures à 8192×8192 peuvent ne pas être prises en charge sur les anciens appareils. Vous pouvez vérifier les limitations de votre GPU cible sur GPUinfo.org.

Les GPU mobiles sont généralement limités à des textures 4096 × 4096. De plus, certains GPU mobiles ne prennent pas en charge la répétition de textures de taille différente de la puissance de deux. Par conséquent, si vous souhaitez que votre texture s'affiche correctement sur toutes les plates-formes, vous devez éviter d'utiliser des textures supérieures à 4096 × 4096 et utiliser une puissance de deux de tailles si la texture doit se répéter.

Bandes de couleur

Lorsque l'on utilise les moteurs de rendu GLES3 ou Vulkan, le moteur 3D de Godot effectue un rendu interne en HDR. Cependant, la sortie de rendu sera tonemapped à une gamme dynamique basse afin qu'elle puisse être affichée à l'écran. Il peut en résulter des bandes visibles, en particulier lorsque l'on utilise des matériaux non texturés. Cela peut également être observé dans les projets 2D lorsque l'on utilise des textures à gradient lisse.

Il y a deux façons principales de réduire l'effet de postérisation HDR :

  • Activez Use Debanding dans les paramètres du projet. Cela permet d'appliquer un shader de réduction de l'effet de postérisation HDR plein écran comme effet de post-traitement et cela utilise peut de ressource. La réduction de l'effet de postérisation HDR plein écran n'est pris en charge que lorsque vous utilisez les moteurs de rendu GLES3 ou Vulkan. Il nécessite également que la fonction HDR soit activée dans les paramètres du projet (ce qui est le cas par défaut).

  • Vous pouvez également intégrer du bruit dans vos textures. Ceci est principalement efficace en 2D, par exemple pour les effets de vignettage. En 3D, vous pouvez également utiliser un custom debanding shader à appliquer sur vos materials. Cette technique fonctionne même si votre projet est rendu en LDR, ce qui signifie qu'elle fonctionnera lorsque vous utiliserez le moteur de rendu GLES2.

Voir aussi

Voir Bandes dans les jeux : A Noisy Rant pour plus de détails sur les bandes et les moyens de les combattre.

Précision du tampon de profondeur

Pour trier les objets dans l'espace 3D, les moteurs de rendu s'appuient sur un tampon de profondeur (aussi appelé Z-tampon). Ce tampon a une précision finie : 24 bits sur les plateformes de bureau, parfois 16 bits sur les plateformes mobiles (pour des raisons de performances). Si deux objets différents se retrouvent sur la même valeur de tampon, il y a alors combat en Z. Cela se matérialisera sous la forme de textures vacillant d'avant en arrière lorsque la caméra se déplace ou tourne.

Pour rendre le tampon de profondeur plus précis sur la zone rendue, vous devez augmenter la propriété Near du nœud Camera. Attention toutefois : si vous la réglez trop haut, les joueurs pourront voir à travers la géométrie proche. Vous devez également réduire la propriété Far du nœud Camera à la valeur la plus basse autorisée pour votre cas d'utilisation, mais gardez à l'esprit qu'elle n'aura pas un impact aussi important sur la précision que la propriété Near.

Si vous n'avez besoin d'une grande précision que lorsque le joueur peut voir au loin, vous pouvez la modifier dynamiquement en fonction des conditions de jeu. Par exemple, si le joueur entre dans un avion, la propriété Near peut être temporairement augmentée pour éviter les combats en Z au loin. Elle peut ensuite être diminuée une fois que le joueur a quitté l'avion.

Selon la scène et les conditions de visualisation, vous pouvez également déplacer les objets combattant en Z plus loin sans que la différence soit visible pour le joueur.

Tri par transparence

Dans Godot, les matériaux transparents sont dessinés après les matériaux opaques. Les objets transparents sont triés de l'arrière vers l'avant, avant d'être dessinés en fonction de la position du Spatial, et non de la position du sommet dans le plan du monde. De ce fait, les objets qui se chevauchent peuvent souvent être triés dans le désordre. Pour corriger les objets mal triés, modifiez la propriété Render Priority du matériau. Cela obligera les matériaux spécifiques à apparaître devant ou derrière d'autres matériaux transparents. Malgré tout, cela n'est pas toujours suffisant.

Certains moteurs de rendu proposent des techniques de transparence indépendantes de l'ordre pour pallier ce problème, mais cela est coûteux pour le GPU. Godot ne fournit pas cette fonctionnalité actuellement. Il y a encore plusieurs façons d'éviter ce problème :

  • Ne faites des matériaux transparents que si vous en avez besoin. Si un matériau a seulement une petite partie transparente, envisagez de le diviser en plusieurs matériaux séparés. Cela permettra à la partie opaque de projeter des ombres et potentiellement d'améliorer les performances.

  • Si votre texture est composée principalement de zones totalement opaques et totalement transparentes, vous pouvez utiliser le test alpha au lieu du mélange alpha. Ce mode de transparence est plus rapide et ne cause pas de problème de transparence. Activez Paramètres > Utiliser la Découpe Alpha dans SpatialMaterial, et ajustez le Seuil de découpe Alpha si besoin. À noter que le MSAA n'adoucira pas les contours de la texture mais que le FXAA oui.

  • Si vous devez rendre les zones semi-transparentes d'une texture, le découpage alpha ne conviendra pas. À la place, changer la propriété Paramètres > Mode de Profondeur de Dessin du SpatialMaterial sur Pre-Pass Opaque peut parfois fonctionner (avec un coût de performances).

  • Si vous voulez qu'un matériau s'efface avec la distance, utilisez le mode d'effacement de distance de SpatialMaterial Pixel Dither ou Object Dither au lieu de PixelAlpha. Cela rendra le matériau opaque. De cette façon, il peut également projeter des ombres.

Anticrénelage multi-échantillons

L'anticrénelage multi-échantillons (MSAA) permet de prélever plusieurs échantillons de couverture sur les bords des polygones lors du rendu des objets. Il n'augmente pas le nombre d'échantillons de couleur utilisés pour rendre une scène. Voici ce que cela signifie en pratique :

  • Les bords des maillage seront bien lissés (tout comme avec le suréchantillonnage(supersampling)).

  • Les matériaux transparents qui utilisent l'alpha testing (transparence de 1 bit) ne seront pas lissés.

  • le specular aliasing ("scintillements" qui apparaissent sur les surfaces réfléchissantes) ne sera pas réduit.

Il existe plusieurs façons de contourner cette limitation, en fonction de votre budget de performance :

  • Pour rendre le specular aliasing moins perceptible, ouvrez les Paramètres du projet et activez Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter. Ce filtre a un coût modéré sur les performances. Il ne doit être activé que si vous en avez réellement besoin.

  • Activer le FXAA en plus (ou à la place) du MSAA. Comme le FXAA est une méthode d'antialiasing de l'espace de l'écran, il va tout lisser. L'inconvénient est qu'il rendra la scène plus floue, surtout à des résolutions inférieures à 1440p.

  • Rendre la scène à une résolution plus élevée, puis l'afficher dans un ViewportTexture qui correspond à la taille de la fenêtre. Veillez à activer le Filter sur les drapeaux ViewportTexture. Cette technique est appelée supersampling et est très lente. Son utilisation n'est généralement recommandée que pour le rendu hors ligne.