¿Por qué el hardware de gráficos solo representa triángulos?

TL; DR : los triángulos son lo suficientemente buenos como para resolver los problemas básicos de modelado y renderizado, y las técnicas basadas en ellos son lo suficientemente flexibles como para adaptarse a problemas avanzados. Simplemente no hay necesidad real de soportar otras primitivas.

¿Por qué triángulos?
La interacción con la luz es más fácil de simular para objetos completamente opacos, porque solo sus superficies deben tenerse en cuenta. Ese es un orden de magnitud menos datos en las descripciones. La forma más fácil de modelar superficies arbitrarias es aproximando mallas triangulares. Podría decirse que un triángulo es el elemento de superficie universal más simple: es el casco convexo de tres puntos. Un segmento de línea o un punto son aún más simples, pero no son superficies: no es posible usar solo un número finito sin grietas. Por otro lado, podemos usar tan pocos triángulos como queramos y todavía no tenemos espacios. En términos matemáticos, las mallas triangulares tienen continuidad de orden cero ([matemática] C_0 [/ matemática]).

¿Por qué no otra cosa?
Claro, otras primitivas podrían ser mejores en algún sentido. Los triángulos de Bézier, por ejemplo, proporcionarían una continuidad de orden superior (“suavidad”), pero pueden aproximarse razonablemente por triángulos planos más pequeños. El NV1 era capaz de rasterizar parches Bézier bi-cuadráticos (cuadriláteros), pero no se dieron cuenta. Los triángulos planos se convirtieron en el mínimo común denominador de las API de gráficos como OpenGL y Direct3D, y el resto es historia.

Los algoritmos gráficos en 2-D no solo representan triángulos. En realidad, es bastante eficiente dibujar un polígono arbitrario y, no solo eso, usar coordenadas integrales bastante cuidadosas y el algoritmo de Bresenham, para garantizar que no haya superposiciones.

El hardware 3-D generalmente dibuja puntos (y a veces símbolos o fuentes), líneas y triángulos. Puede haber otras cosas, pero primero se descomponen en triángulos. Esto se debe a que un triángulo en 3-D especifica de manera única un plano. Más vértices no. Para los cuadriláteros, a menos que se garantice que todos los vértices se encuentran en un plano (muy difícil con los errores de coma flotante acumulados), se obtiene el problema de la corbata de lazo, donde ciertas orientaciones de un cuadrilátero harán que parezca una corbata de lazo, incluso esto no No es tan bueno para el renderizado, pero es deseable que el frente y la parte posterior del polígono tengan propiedades diferentes. Es deseable, por ejemplo, realizar el sacrificio de la cara posterior, por lo que el lado posterior de un polígono nunca se dibuja, lo que generalmente proporciona una aceleración bastante buena.

Dibujar solo triángulos simplifica el hardware de dibujo, lo que hace posible tener muchos renderizadores de triángulos al mismo tiempo. Este paralelismo ha causado problemas para las implementaciones de OpenGL, que tradicionalmente han requerido que las imágenes aparezcan como si hubieran sido dibujadas secuencialmente en el mismo orden dado. Sin embargo, las cartas modernas tienen trucos para garantizar que los triángulos aparezcan como si hubiesen sido dibujados en un cierto orden cuando en realidad no lo son. Creo que Silicon Graphics Reality Engine fue el primero en hacer esto, pero estoy seguro de que se ha implementado en muchas de las tarjetas gráficas más modernas.

En realidad, un rectángulo requiere 3 puntos para ser completamente especificado; si solo especifica dos puntos, solo puede especificar rectángulos no rotados.

Cierto hardware le permite usar diferentes tipos como primitivas, por ejemplo, Quads (también conocidos como rectángulos) y parches cuadráticos, cúbicos o Bezier. Dicho esto, la mayoría de estos tipos se vuelven a teselar en triángulos sin procesar para renderizar.

Las razones principales por las que renderizan triángulos es que los triángulos se teselan bien. No terminas con grietas en la malla donde se unen dos bordes, lo que puedes hacer con diferentes primitivas. Son fáciles de recortar (lo que debe hacer con cualquier cosa que esté dibujando que esté parcialmente fuera de la pantalla). También son planos, o planos. Lo que significa que nunca te preocupará si lo que estás renderizando es convexo o cóncavo; siempre es ninguno de los dos. En resumen, simplifica las matemáticas.

¿Por qué más API no le permiten usar primitivas de orden superior? Pura y simplemente porque la mayoría de las API están diseñadas para un alto rendimiento. Si necesita pasar tiempo probando una malla cada vez que la usa, está dejando el rendimiento sobre la mesa. Es mejor probarlo sin conexión y pasar triángulos directamente, por lo que las API reflejan este uso.

Dicho esto, DirectX 11 (por ejemplo) le permite escribir su propio dominio y sombreadores de casco, para que pueda controlar la teselación y la creación de geometría desde cualquier entrada que desee.

Al dibujar en un área de 2 dimensiones (pantalla), es fácil pensar que la imagen está compuesta de puntos, líneas y superficies. Pero cada imagen se puede dividir en 3 primitivas. p.ej :
Una vista del cielo nocturno puede estar hecha de puntos para las estrellas.
Se puede hacer un mapa simple de líneas para direcciones.
Una casa puede estar hecha de paredes rectangulares que se pueden dividir en dos triángulos.
Cada superficie puede ser aproximada por polígonos o grupos de polígonos.
Cada polígono se puede convertir en un grupo de triángulos.
Por lo tanto, las 3 primitivas son líneas de puntos y triángulos.

El hardware de gráficos permitirá al programador dibujar las 3 primitivas directamente. Más allá de esto, el programador tiene que componer las imágenes por su cuenta. Por supuesto, el hardware puede proporcionar más que estos y permitir dibujar cosas más complejas directamente, pero las 3 primitivas son el mínimo necesario.

Puedo dar dos analogías para esto:
(1) Todos los enteros se pueden obtener (multiplicando) a partir de números primos (primitivos)
(2) Todos los números pueden imprimirse si tenemos una manera de imprimir solo los 10 dígitos (primitivas) con una forma de componer todos los números como cateaciones de los 10 dígitos.

Del mismo modo, todas las imágenes bidimensionales se pueden obtener de las 3 primitivas.

Tenga en cuenta que los rectángulos (y los pentágonos y los polígonos superiores) no son primitivos.