Presupuesto de modelos 3D. Lo que importa más cantidad de triángulos o vértices

12

Cuando estoy haciendo un modelo para un juego 3D, ¿qué debo tomar como medida en mi presupuesto Polígonos (triángulos) o vértices? He hecho un experimento con dos conjuntos de 40000 cubos, uno con 8 vértices y 12 triángulos, otro con 24 vértices y 12 triángulos. Todo se hizo en Unity y ambos fueron generados por procedimientos. Para mi sorpresa, ambos sets funcionaron casi igual, había una diferencia muy pequeña entre ellos.

¿Significa que no debería preocuparme por el recuento de vértices y solo mirar el recuento de triángulos?

EDITAR: Hice otro experimento, creé un avión con triángulos de 19602 y 10000 vértices y otro con la misma cantidad de tirangles pero 39204 vértices. He generado 4000 de ambos. Ahora menos vértices ganaron 14 fps a 19 fps. Entonces, supongo que generalmente menos es mejor, pero solo en grandes diferencias.

Michał Leszczyński
fuente
99
Escribe tu juego y soluciona los problemas a medida que surjan. Es posible que este tipo de problema nunca surja y está perdiendo el tiempo: P
Vaillancourt

Respuestas:

16

Imaginemos una gran malla de cuadrícula, como una que podríamos usar para el terreno. Representaremos ntriángulos, cubriendo, digamos, la mitad de nuestra pantalla de 1080p, en una sola llamada de sorteo.

Si soldamos todos nuestros vértices y no tenemos costuras de suavizado / texturizado, cada triángulo tiene 3 vértices y cada vértice es compartido por 6 triángulos, por lo que tenemos n/2vértices.

Para renderizar esto necesitamos:

  • Ejecute el sombreador de vértices al menos n/2veces

    ("al menos" porque nuestra memoria caché para los resultados de vértices es tan grande. A veces terminaremos desalojando un vértice que ya transformamos, luego lo necesitaremos nuevamente para un triángulo posterior que lo comparta y vuelva a ejecutar el sombreador de vértices en él Así que no obtenemos tanto ahorro como parece en papel)

  • Recortar y seleccionar ntriángulos.

  • Rasteriza e interpola en al menos 1920x1080 / 2 o aproximadamente 1 millón de píxeles del búfer de cuadros (ya que dijimos que nuestro terreno cubre aproximadamente la mitad de la pantalla).

    ("al menos" debido a la forma en que las GPU funcionan en cuadrículas de píxeles , algunos fragmentos justo fuera de los bordes de los polígonos aún se rasterizan pero luego se enmascaran, lo que significa que procesamos fragmentos dos veces. se oculta, si no tenemos la suerte de dibujar primero el polígono en el búfer de profundidad)

  • Ejecute el sombreador de fragmentos para todos esos> = 1 millón de fragmentos.

  • Mezcle ~ 1 millón de resultados en los búferes de marco y profundidad.

Bien, ahora vamos a soldar todos nuestros vértices, ¡así que ahora tenemos 3nvértices para renderizar, seis veces más que antes! Nuestros pasos son ...

  • Ejecute los 3ntiempos del sombreador de vértices .

    (No hay asteriscos debido al almacenamiento en caché ya que cada vértice se usa solo una vez, aunque esto significa que el caché no puede salvarnos en ningún momento)

  • Recortar y seleccionar ntriángulos.

  • Rasteriza e interpola en al menos 1920x1080 / 2 o aproximadamente 1 millón de píxeles del búfer de cuadros.

  • Ejecute el sombreador de fragmentos para todos esos> = 1 millón de fragmentos.

  • Mezcle ~ 1 millón de resultados en los búferes de marco y profundidad.

... espera, cada paso excepto el primero es el mismo! Por lo tanto, la mayor parte del trabajo que realiza la GPU en una llamada de extracción típica no está directamente relacionada con la cantidad de vértices utilizados. La cantidad de cobertura de pantalla, sobregiro y el recuento total de triángulos representan mucho más del costo.

Eso no significa que los vértices sean completamente libres. Si comparte vértices cuando puede, puede obtener algunos ahorros modestos con el almacenamiento en caché, especialmente si los sombreadores de vértices son complicados o la tubería de vértices de su hardware es débil (como fue el caso en algunas consolas más antiguas). Pero dado que el recuento de vértices sigue proporcionalmente al recuento de triángulos más o menos un factor constante, generalmente no es una medida tan interesante del costo total de la malla.

DMGregory
fuente
¿Qué pasa con el costo de enviar esos vértices a la memoria?
Michał Leszczyński
77
A menos que cambie su búfer de vértices cada cuadro, paga el costo de carga una vez. Es probable que sus texturas y el búfer de cuadros sean los cerdos más grandes de memoria de video y ancho de banda dentro de cualquier cuadro dado. Todavía significa que los vértices ciertamente no son gratuitos, y es mejor compartirlos cuando sea práctico, pero los vértices no compartidos rara vez serán la razón por la que un juego funciona mal.
DMGregory
Agregaré a esto, ya que estoy haciendo bosques, etc. en mi juego. Cuando comencé, inicialmente estaba usando llamadas de extracción (uso mi propio motor, esto puede no coincidir completamente con su pregunta) para dibujar modelos solo con verts, esto en sí mismo estaba bien, el rendimiento estaba bien. Pero, cuando comencé a usar la indexación, obtuve una mejora en el rendimiento porque algunos verts se compartieron y se almacenaron en caché, por lo que algunos cálculos no se realizaron dos veces. El resultado final es que esa prueba cruda de verts por sí sola no es el mejor indicador de verts vs tri count. Su tubería puede verse afectada por demasiados. Como otras respuestas aluden.
ErnieDingo
2

Ninguno.

A menos que esté hablando de cantidades realmente enormes de tris (millones), lo que le importa es:

  • Número de píxeles renderizados
  • Costo del sombreador de fragmentos
  • Número de llamadas de sorteo (con el límite fuertemente dependiendo del dispositivo).

24 vértices por 4000 cubos dan 96'000 vértices.

640x380 píxeles proporciona 243'200 fragmentos, y la mayoría de los dispositivos admiten resoluciones considerablemente más grandes.

Puede volver a ejecutar su experimento con 1'000'000 cubos, agrupados para evitar el cuello de botella de la llamada de extracción (1 modelo único para 1'000 cubos).

Peter
fuente
2
Esto depende mucho de la escena y de cómo se renderiza. Si tiene una escena que, naturalmente, tiene un sobregiro relativamente pequeño, el procesamiento de vértices ciertamente puede dominar su rendimiento. Además, el número de llamadas de extracción no es el problema (para algunas API) sino los cambios de estado entre las llamadas de extracción.
Nicol Bolas
1

Vale la pena señalar que si está haciendo una aplicación WebGL, el conteo de vértices se convierte rápidamente en un cuello de botella en términos de tamaño de archivo para que los usuarios lo descarguen. El mismo número de triángulos, pero a menudo 2-3 veces más vértices que los que se muestran en el software DCC. Un mejor desenvolvimiento puede ayudar mucho en este caso al tener menos costuras.

Francisco Toledo
fuente