¿Por qué los ventiladores triangulares no son compatibles con Direct3D 10 o posterior?

16

Como se cubre en la documentación, los ventiladores triangulares no son compatibles con Direct3D 10 o posterior .

¿Por qué? ¿Existen inconvenientes inherentes a trabajar con ventiladores triangulares?

Micah Bolen
fuente
55
Tengo entendido que debido a que los ventiladores de triángulos a menudo resultan en triángulos largos muy delgados que resultan en interops que causan artefactos. También creo que requiere llamadas separadas para representar cualquier intento que no esté conectado con un ventilador. Donde sea posible con una tira. No creo que haya nada que los fanáticos puedan hacer que las tiras no puedan hacer mejor.
ClassicThunder
3
Los ventiladores se pueden conectar mediante índices, por lo que no se necesitan llamadas separadas. Lo mismo también se aplica a las tiras (e incluso puede conectar ventiladores con tiras), que es mucho más flexible, no requiere tris degenerados y más liviano en términos de ancho de banda.
Maximus Minimus

Respuestas:

15

Durante más de una década, los proveedores de hardware han estado promocionando las tiras triangulares, las listas de triángulos indexados y las tiras triangulares indexadas como los tipos primitivos más rápidos de usar. ¿Por qué? Las tiras tienen una mejor ubicación de caché (reutilizando los últimos 2 verts enviados en lugar de tener que saltar continuamente al primero) y la indexación permite que los cachés de vértices de hardware realmente funcionen, además de ser más efectivos para eliminar los verts duplicados.

Si todos los proveedores de hardware dicen "hágalo de esta manera y va a ser más rápido", entonces hay una buena posibilidad de que si lo hace de esta manera, será más rápido.

Entonces D3D10 + simplemente formaliza esto; si esa es la ruta rápida, entonces esa es la ruta que usará y no existirán otras rutas. Esto está de acuerdo con una de las filosofías de diseño de D3D10 +, que es ponerlo en el camino rápido y mantenerlo allí.

Maximus Minimus
fuente
4

No sé cuánto afecta esto realmente al desarrollo, pero como con cualquier cambio de este tipo, se ha dicho que permitirán que los desarrolladores de controladores escriban mejores controladores. La complejidad de los controladores de GPU es sorprendente, pero no estoy seguro de si este cambio exacto ayudará mucho.

En cualquier caso, es posible reemplazar los ventiladores triangulares para la mayoría de sus necesidades (como la representación de polígonos convexos) con tiras, a menudo con mejores resultados.

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

EDITAR: olvidó mencionar, si necesita cambiar el orden de bobinado, simplemente invierta la prueba en ese "si" (== a! =).

serpiente5
fuente
3

(Esta pregunta en particular garantiza una respuesta de opinión :)

Subjetivamente, diría que su arquitectura es el astronautismo. OpenGLES también arrojó un montón de cosas para hacerlo "menos complejo", mientras que en realidad solo empujó la complejidad a todos y cada uno de los desarrolladores con código heredado.

Por supuesto, incluso cuando el hardware no lo admite de forma nativa, habría sido trivial proporcionar compatibilidad con las personas que secuencian los ventiladores de triángulos al convertirlos en tiras o triángulos.

Los tiempos de ejecución de WebGL y demás tienen que hacer un seguimiento de los buffers validados y todo el tiempo, y los conductores pueden manejar fácilmente a las personas que les envían fanáticos a pesar de que no lo admiten.

Así que la eliminación total de FFP y tal es solo una gran molestia de la OMI.

Será
fuente
Hace 10 años o más, esta habría sido una buena respuesta. Hoy en día, la tubería de vértices casi siempre se implementa en hardware, y es más probable que los datos de vértices se almacenen en objetos de búfer en la memoria de la GPU, por lo que una implementación hipotética de fan-to-strip en un controlador requeriría que los datos del vértice vuelvan a la memoria de la CPU para reordenar y luego volver a cargarlo en la memoria de la GPU. Eso no solo arruina todo el uso de objetos de búfer (ya que ya no tiene datos de vértices estáticos) sino que requiere una lectura de la memoria de la GPU, por lo que hola se detiene y el bajo rendimiento.
Maximus Minimus
1
@ mh01 ¿qué hardware no admite el ventilador de forma nativa? El HW tiene que trabajar con el OpenGL completo después de todo ...
Será el
Los datos de vértice pueden almacenarse en la memoria de la GPU, pero en primer lugar tiene que llegar desde la memoria del sistema (al menos una vez). Eso es a través del conductor. (Suponiendo que los datos se originaron en el lado de la CPU, que, a excepción de las demostraciones de hardware especializadas, casi siempre lo hace).
BrainSlugs83