3D Render Beschränkungen

Siehe auch

Zusätzlich zu den unten aufgeführten Einschränkungen haben mobile Plattformen noch mehr Einschränkungen beim 3D-Rendering im Vergleich zu Desktop-Plattformen. Siehe Mobile rendering limitations für weitere Informationen.

Einführung

Echtzeit-Rendering-Engines haben aufgrund ihrer Ausrichtung auf Leistung viele Einschränkungen. Der Renderer von Godot ist da keine Ausnahme. Um mit diesen Einschränkungen effektiv arbeiten zu können, müssen Sie diese verstehen.

Beschränkung der Texturgröße

Auf Desktops und Laptops älterer Generation werden Texturen größer als 8192 × 8192 möglicherweise nicht unterstützt. Sie können die Einschränkungen Ihrer Ziel-GPU auf GPUinfo.org überprüfen.

Mobile GPUs sind normalerweise auf 4096x4096 Texturen limitiert. Nicht jede mobile GPU unterstützt gekachelte Texturen, deren Größe keine Zweierpotenz aufweist. Deshalb sollte für eine korrekte Darstellung auf allen Plattformen diese Regel beachtet sowie die Nutzung von Texturen vermieden werden, die größer sind als 4096x4096.

Farbstreifen

When using the GLES3 or Vulkan renderers, Godot's 3D engine renders internally in HDR. However, the rendering output will be tonemapped to a low dynamic range so it can be displayed on the screen. This can result in visible banding, especially when using untextured materials. This can also be seen in 2D projects when using smooth gradient textures.

Es gibt viele Möglichkeiten, den Hintergrund festzulegen:

  • Enable Use Debanding in the Project Settings. This applies a fullscreen debanding shader as a post-processing effect and is very cheap. Fullscreen debanding is only supported when using the GLES3 or Vulkan renderers. It also requires HDR to be enabled in the Project Settings (which is the default).

  • Alternatively, bake some noise into your textures. This is mainly effective in 2D, e.g. for vignetting effects. In 3D, you can also use a custom debanding shader to be applied on your materials. This technique works even if your project is rendered in LDR, which means it will work when using the GLES2 renderer.

Siehe auch

See Banding in Games: A Noisy Rant for more details about banding and ways to combat it.

Tiefenpuffergenauigkeit

Um Objekte im 3D-Raum zu sortieren, stützen sich Rendering-Engines auf einen depth buffer (auch Z-Puffer genannt). Dieser Puffer hat eine endliche Genauigkeit: 24 Bit auf Desktop-Plattformen, manchmal 16 Bit auf mobilen Plattformen (aus Leistungsgründen). Wenn zwei verschiedene Objekte auf demselben Pufferwert landen, kommt es zu Z-Kämpfen. Dies äußert sich in Form von hin- und herflackernden Texturen, wenn sich die Kamera bewegt oder dreht.

To make the depth buffer more precise over the rendered area, you should increase the Camera node's Near property. However, be careful: if you set it too high, players will be able to see through nearby geometry. You should also decrease the Camera node's Far property to the lowest permissible value for your use case, though keep in mind it won't impact precision as much as the Near property.

Wenn Sie eine hohe Präzision nur dann benötigen, wenn der Spieler weit sehen kann, können Sie sie dynamisch je nach Spielbedingungen ändern. Wenn der Spieler zum Beispiel ein Flugzeug betritt, kann die Eigenschaft Near vorübergehend erhöht werden, um Z-Kämpfe in der Ferne zu vermeiden. Sobald der Spieler das Flugzeug verlässt, kann sie wieder verringert werden.

Depending on the scene and viewing conditions, you may also be able to move the Z-fighting objects further apart without the difference being visible to the player.

Transparenz-Sortierung

In Godot werden transparente Materialien nach undurchsichtigen Materialien gezeichnet. Transparente Objekte werden vor dem Zeichnen von hinten nach vorne sortiert, basierend auf der Position des Spatials, nicht auf der Position des Scheitelpunkts im Weltraum. Aus diesem Grund werden sich überlappende Objekte oft in der falschen Reihenfolge sortiert. Um falsch sortierte Objekte zu korrigieren, ändern Sie die Eigenschaft Render Priority des Materials. Dadurch werden bestimmte Materialien vor oder hinter anderen transparenten Materialien angezeigt. Aber selbst dann ist dies nicht immer ausreichend.

Some rendering engines feature order-independent transparency techniques to alleviate this, but this is costly on the GPU. Godot currently doesn't provide this feature. There are still several ways to avoid this problem:

  • Machen Sie Materialien nur dann transparent, wenn Sie diese wirklich brauchen. Wenn ein Material nur einen kleinen transparenten Teil hat, sollten Sie es in ein separates Material aufteilen. Dadurch kann der undurchsichtige Teil Schatten werfen und auch die Leistung verbessern.

  • If your texture mostly has fully opaque and fully transparent areas, you can use alpha testing instead of alpha blending. This transparency mode is faster to render and doesn't suffer from transparency issues. Enable Parameters > Use Alpha Scissor in SpatialMaterial, and adjust Alpha Scissor Threshold accordingly if needed. Note that MSAA will not anti-alias the texture's edges, but FXAA will.

  • If you need to render semi-transparent areas of the texture, alpha scissor isn't suitable. Instead, setting the SpatialMaterial's Parameters > Depth Draw Mode property to Opaque Pre-Pass can sometimes work (at a performance cost).

  • Wenn Sie möchten, dass ein Material mit der Entfernung verblassen soll, verwenden Sie den Spatial Materialmodus Pixel Dither oder Object Dither anstelle von PixelAlpha. Dadurch wird das Material undurchsichtig. Auf diese Weise kann es auch Schatten werfen.

Multisample Anti-Aliasing

Multi-sample antialiasing (MSAA) takes multiple coverage samples at the edges of polygons when rendering objects. It does not increase the number of color samples used to render a scene. Here's what this means in practice:

  • Die Ränder der Meshs werden schön geglättet (ebenso wie beim Supersampling).

  • Transparente Materialien, die Alpha-Tests (1-Bit-Transparenz) verwenden, werden nicht geglättet.

  • Spiegel-Aliasing ("Funkeln", das auf reflektierenden Oberflächen auftritt) wird nicht reduziert.

Es gibt mehrere Möglichkeiten, diese Einschränkung abhängig von Ihrem Leistungsbudget zu umgehen:

  • Um das spiegelnde Aliasing zu verringern, öffnen Sie die Projekteinstellungen und aktivieren Sie Rendering > Qualität > Screen Space-Filter > Screen Space Roughness Limiter. Dieser Filter hat einen moderaten Einfluss auf die Leistung. Er sollte also nur aktiviert werden, wenn Sie ihn tatsächlich benötigen.

  • Aktivieren Sie FXAA zusätzlich zu (oder anstelle von) MSAA. Da FXAA eine Screen-Space-Antialiasing-Methode ist, glättet sie alles. Der Nachteil ist, dass es die Szene unschärfer erscheinen lässt, insbesondere bei Auflösungen unter 1440p.

  • Rendern Sie die Szene mit einer höheren Auflösung und zeigen Sie sie dann in einer Viewport-Textur an, die der Fenstergröße entspricht. Stellen Sie sicher, dass Sie den Filter auf den ViewportTexture-Flags aktivieren. Diese Technik wird supersampling genannt und ist sehr langsam. Ihre Verwendung wird im Allgemeinen nur für das Offline-Rendering empfohlen.