Limitaciones del renderizado 3D

Introducción

Debido a su enfoque en el rendimiento, los motores de representación en tiempo real tienen muchas limitaciones. El renderizador de Godot no es una excepción. Para trabajar eficazmente con esas limitaciones, es necesario entenderlas.

Límites de tamaño de textura

En los ordenadores de sobremesa y portátiles, las texturas superiores a 8192×8192 pueden no ser compatibles con los dispositivos más antiguos. Puedes comprobar las limitaciones de tu GPU de destino en GPUinfo.org.

Las GPUs para móviles suelen estar limitadas a texturas de 4096×4096. Además, algunas GPU para móviles no admiten la repetición de texturas sin potencia de dos tamaños. Por lo tanto, si quieres que tu textura se muestre correctamente en todas las plataformas, debes evitar usar texturas más grandes que 4096×4096 y usar una potencia de dos tamaños si la textura necesita repetirse.

Bandas de color

Al usar los renderizadores GLES3 o Vulkan, el motor 3D de Godot se renderiza internamente en HDR. Sin embargo, la salida del renderizado se tonifica a un rango dinámico bajo para que pueda ser mostrado en la pantalla. Esto puede dar lugar a una banda visible, especialmente cuando se utilizan materiales sin textura. Esto también se puede ver en proyectos 2D cuando se utilizan texturas de gradientes suaves.

Hay varias maneras de aliviar el anillado. Aquí hay algunos ejemplos:

  • Haz un poco de ruido en tus texturas. Esto es principalmente efectivo en 2D, por ejemplo, para efectos de viñetas.
  • Implementar un shader de suavizado como shader de pantalla. Godot actualmente no proporciona un shader de suavizado, pero esto puede ser añadido en una futura versión.

Ver también

Ver Banding in Games: A Noisy Rant para más detalles sobre el anillado y las formas de combatirlo.

Precisión del buffer de profundidad

Para clasificar los objetos en el espacio 3D, los motores de renderizado se basan en un buffer de profundidad (también llamado Z-buffer). Este búfer tiene una precisión finita: 24 bits en las plataformas de escritorio, a veces 16 bits en las plataformas móviles (por razones de rendimiento). Si dos objetos diferentes terminan en el mismo valor de la memoria intermedia, entonces se producirá la lucha Z. Esto se materializará en forma de texturas que parpadean hacia adelante y hacia atrás a medida que la cámara se mueve o gira.

Para que la memoria intermedia de profundidad sea más precisa en el área de renderizado, deberías aumentar la propiedad Casi del nodo de la cámara. Sin embargo, ten cuidado: si lo pones demasiado alto, los jugadores podrán ver a través de la geometría cercana. También deberías disminuir la propiedad Lejos del nodo de la cámara al valor más bajo permitido para tu caso de uso, aunque ten en cuenta que no afectará a la precisión tanto como la propiedad Cercana.

Si sólo necesitas alta precisión cuando el jugador puede ver a lo lejos, podrías cambiarlo dinámicamente según las condiciones del juego. Por ejemplo, si el jugador entra en un avión, la propiedad Casi puede ser aumentada temporalmente para evitar la lucha Z en la distancia. Entonces puede ser disminuido una vez que el jugador deja el avión.

Dependiendo de la escena y de las condiciones de visualización, también puede ser capaz de mover los objetos del combate Z más lejos sin que la diferencia sea visible para el jugador.

Orden de transparencia

En Godot, los materiales transparentes se dibujan después de los materiales opacos. Los objetos transparentes se ordenan de atrás hacia adelante antes de ser dibujados en base a la posición del Nodo3D, no a la posición del vértice en el espacio mundial. Debido a esto, los objetos superpuestos a menudo pueden ser clasificados fuera de orden. Para arreglar los objetos mal clasificados, ajusta la propiedad del material :ref:``Render Priority <class_Material_property_render_priority>`. Esto obligará a que determinados materiales aparezcan delante o detrás de otros materiales transparentes. Incluso entonces, esto puede no ser siempre suficiente.

Algunos motores de renderizado cuentan con técnicas de transparencia independiente del orden para aliviar esto, pero esto es costoso en la GPU. Godot actualmente no proporciona esta característica. Todavía hay varias maneras de evitar este problema:

  • Sólo haz los materiales transparentes si realmente los necesitas. Si un material sólo tiene una pequeña parte transparente, considere la posibilidad de dividirlo en un material separado. Esto permitirá que la parte opaca proyecte sombras y también puede mejorar el rendimiento.
  • Si quieres que un material se desvanezca con la distancia, usa el modo de desvanecimiento de distancia de Material Espacial Pixel Dither o Object Dither en lugar de PixelAlpha. Esto hará que el material sea opaco. De esta manera, también puede proyectar sombras.

Multi-sample antialiasing

El antialiasing de muestras múltiples (MSAA) toma múltiples muestras de cobertura en los bordes de los polígonos al renderizar los objetos. No aumenta el número de muestras de color utilizadas para representar una escena. Esto es lo que significa en la práctica:

  • Los bordes de las mallas se alisarán bien (como lo haría el supermuestreo).
  • Los materiales transparentes que usan pruebas alfa (transparencia de 1 bit) no se suavizarán.
  • El aliasing molecular ("destellos" que aparecen en las superficies reflectantes) no se reducirá.

Existen varios modos resolver esta limitación dependiendo de cuánto margen tengas en el desempeño:

  • Para hacer menos notorio el aliasing especular, abre la Configuración del Proyecto y habilita Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter. Este filtro tiene un coste moderado en cuanto a rendimiento. Debería estar habilitado sólo si realmente lo necesitas.
  • Habilitar FXAA además de (o en lugar de) MSAA. Como FXAA es un método de antialiasing en el espacio de la pantalla, suavizará cualquier cosa. Como desventaja, también hará que la escena parezca más borrosa, especialmente con resoluciones por debajo de 1440p.
  • Renderiza la escena a una resolución más alta, y luego visualízala en un ViewportTexture que coincida con el tamaño de la ventana. Asegúrate de activar el Filtro en las banderas de ViewportTexture. Esta técnica se llama supermuestreo y es muy lenta. Por lo general, se recomienda su uso sólo para la representación fuera de línea.