Limitaciones del renderizado 3D

Ver también

Además de las limitaciones mencionadas a continuación, las plataformas móviles tienen aún más limitaciones en el renderizado en 3D en comparación con las plataformas de escritorio. Consulta Limitaciones de renderizado en dispositivos móviles para obtener más información.

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 dos caminos principales para solucionar las bandas:

  • Habilite Use Debanding en la configuración del proyecto. Esto aplica un sombreador de eliminación de bandas como un efecto de posprocesamiento y es muy ligero. El eliminamiento de bandas de pantalla completa solo está soportado cuando se usa el renderizador GLES3 o Vulkan. También requiere que el HDR esté habilitado en la configuración del proyecto (que es el comportamiento predeterminado).

  • Alternativamente, aplique algo de ruido en tus texturas. Esto puede ser principalmente efectivo en 2D, por ejemplo, para efectos de viñeteado. En 3D, puedes usar un sombreador de eliminación de bandas personalizado <https://github.com/fractilegames/godot-gles2-debanding-material> para aplicar en tus materiales. Esta técnica funcionará incluso si tu proyecto está renderizado en LDR, por lo que funcionará cuando uses el renderizado por GLES2.

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 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 tu textura tiene principalmente áreas completamente opacas y completamente transparentes, puedes usar la prueba de alfa en lugar de la mezcla de alfa. Este modo de transparencia es más rápido de renderizar y no sufre problemas de transparencia. Habilita Parameters > Use Alpha Scissor en SpatialMaterial y ajusta el valor de Alpha Scissor Threshold según sea necesario. Ten en cuenta que el MSAA no suavizará los bordes de la textura, pero el FXAA sí lo hará.

  • Si necesitas renderizar áreas semi-transparentes de la textura, la función de recorte alfa no es adecuada. En su lugar, establecer la propiedad Parameters > Depth Draw Mode del SpatialMaterial en Opaque Pre-Pass a veces puede funcionar (aunque a costa de un rendimiento inferior).

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

Multisample anti-aliasing (MSAA)

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.