Si las baldosas fueran un poco más baldosas. Yendo más allá de los límites de la imaginación ingenua

imagen



Cualquiera que haya pensado alguna vez en cómo funciona la parte gráfica de un acelerador retro 2D, representa a grandes rasgos cómo dibuja estos notorios Tiles, que, por cierto, a partir de la definición no tienen por qué ser rectangulares. El mosaico se trata de mosaicos. Sí, la mayoría de las veces los desarrolladores de iron api entienden esto y los métodos se denominan en consecuencia drawRect y no drawTile. Cualquier rectángulo puede ser un mosaico, ¡pero lo contrario no es cierto! Y aquí se está gestando la pregunta: ¿Por qué los aceleradores 2D aceleran persistentemente solo rect ... La respuesta simple a esta pregunta es porque todo lo demás es demasiado complicado para una simple pieza de hardware. Pero aquí yo discutiría. Se puede proponer al menos una extensión simple pero altamente funcional de esta abstracción básica, la siguiente.



No le he escrito a Habr durante mucho tiempo. Porque todo el tiempo quise hacerlo perfectamente ... tengo tal enfermedad. El propio Habr, mientras tanto, ha bajado significativamente el listón, y todavía no escribo y no escribo. Por lo tanto, el artículo de hoy nació sin la preparación de solo una conversación con un amigo. Sin embargo, hay amigos con los que desea hablar profunda y profundamente.



Que sea, quizás, mi regreso a la regularidad. Si tal lectura fácil de más o menos, con una pintura apresurada, pero mínimamente suficiente para una aclaración, la narración no está sobrecargada de detalles, pero aún con un acento conceptual, y como una lámpara, como una vez, llegará a un costoso lector de haber.



En otras palabras, hoy busco un compromiso entre la calidad del contenido y el tiempo que puedo dedicarle. Esperanza de comprensión.



Vamos a empezar…



Considere como muestra la función general de copiar un área rectangular arbitraria. Vemos que esto es solo un bucle doble a través de las líneas y a través de los elementos de las líneas:



imagen



tenga en cuenta que este bloque de código generalmente se repite trivialmente en combinaciones x4 de direcciones de recorrido de ambos bucles para implementar Reflexiones:



imagen



otras combinaciones x2 están dadas por la permutación del orden por dst [x] [y], reflejando a lo largo del eje y = x.

En el camino, estas 8 opciones de reflejos son todas posibles rotaciones en múltiplos de 90gr con todos sus reflejos de espejo de izquierda a derecha.



Y ahora veamos cómo, incluso con adiciones mínimas, este elemento básico podría modificarse en gran medida.



Quizás nunca se le ocurrió a nadie, pero ¿por qué una teja no puede ser, por ejemplo, un paralelepípedo? De cara al futuro, diré que esta extensión tiene una sobrecarga mínima, porque para implementar esto, necesita agregar solo un par de incrementos por línea:



imagen



Como resultado de la combinación con la permutación x / y, obtenemos un paralelepípedo con un par de lados siempre orientados a lo largo de uno ortogonal, y los otros dos estarán en ángulo. ... ¿Qué nos da esta bagatela recibida a bajo precio? Bueno, en primer lugar, la capacidad de usar tres proyecciones fijas:



imagen



si el incremento no es una constante, sino un número fraccionario, el ángulo de desplazamiento puede quedar libre. Que se puede utilizar perfectamente tanto para los efectos de balanceo de baldosas en el scroll lateral: como



imagen



para construir muros en el espacio de proyecciones isométricas:



imagen



¡Y recuerde que hablar fraccional no significa necesariamente soporte flotante! Lo que un programador moderno y malcriado a veces empieza a olvidar. float es fraccional con punto flotante, pero aquí es completamente innecesario. De hecho, cualquier procesador con registros duales, donde la parte superior del par se puede leer como un valor separado, tiene "soporte" para punto fijo fraccional (punto fijo). Además, en este caso, NO se agregará una sola instrucción adicional. (Bueno, excepto que la pendiente se establecerá en 256 golpes) ¡Así que todo es gratis, tomen chicos!



Otro paso similar que el lector atento debe pedir inductivamente es la repetición de este funcional hasta el segundo límite de la enumeración del bucle interno. Después de todo, podemos desacoplar el incremento final por separado. Y luego, en el caso general, podremos dibujar cualquier trapezoide en base a una de las ortogonales (como un caso especial de triángulos):



imagen



¿Y qué diablos nos entregaron? Pensarás, pero adivinarás inmediatamente que en solo dos de esas llamadas de dibujo, simplemente estás texturizando un plano a partir de hexágonos orientados ortogonalmente o rombos orientados diagonalmente de un conjunto de mosaicos preparado para esto. Casos de mosaico que son bastante comunes en la industria del juego, por cierto.



En los días de J2ME
J2ME , . , ,



Sería genial tener soporte de hardware para ellos en el acelerador: el



imagen



resto descrito es más una funcionalidad adicional, ya que puede implementarlo mejor a propósito. Sin embargo, si hablamos, entre otras cosas, solo de llenar la primitiva solo con color (o un patrón plano), para algunas adiciones simples al espacio de juego existente ...



El mismo par de llamadas de dibujo puede formar cualquier triángulo que no se limite a particulares (simplemente se corta en dos por una línea ortogonal a lo largo del medio punto, esto es muy similar a su algoritmo de dibujo clásico) Y a partir de esto ya es posible construir construcciones en perspectiva. Por cierto, a partir de los propios trapezoides, por ejemplo, una proyección 3D fijada verticalmente DOOM1 de la forma se obtiene de forma elemental y económica:

imagen



Si lo desea, puede intentar pintar con relleno incluso algo más o menos grande-vóxel. Dependiendo de los grados de libertad de la proyección, el gasto se llama más o menos. Las dos primeras proyecciones en perspectiva a continuación son fijas pero cada una tiene 4 vistas simétricas, para un total de 8 ángulos de visualización. El tercero es un caso común y solo se fija verticalmente. Girando alrededor del eje vertical, alternará entre el primero y el segundo:



imagen



Es mejor dividir las figuras en trapecios, si es posible, en piezas que estén más alargadas a lo largo de la ortogonal del corte, porque la funcionalidad de llamada adicional, aunque no es costosa, está asociada con iteraciones del ciclo solo externo, de las cuales es deseable que haya menos. De hecho, esto es cierto incluso para dibujar el algoritmo básico del rectángulo: dibujar horizontalmente es más eficiente que vertical.



Es posible realizar texturas en perspectiva sobre la funcionalidad de bonificación en estas llamadas, pero requiere la implementación de escalado fraccional y está asociado a la introducción de coeficientes de divergencia adicionales para src, y coeficientes de diezmado, que, además, deberán calcularse en dinámica en 3D de forma bastante torcida, lo cual no es recomendable para esto. arquitectura sencilla.



Bueno, terminando la venganza ante Habr por mi propio interés, todavía no puedo evitar explicar brevemente de dónde proviene algebraicamente toda esta magia de los coeficientes de incremento. La fórmula de la línea recta y = kx + b, que se enseña en las escuelas, nos envía un saludo aquí dos veces a la vez. Todos los coeficientes fueron útiles en su lugar:



imagen



¿Por qué no me he encontrado con aceleradores de hardware 2D con tal implementación de mosaicos? Solo puedo adivinar:



  • El concepto de Tile era un patrón fijo tan rígidamente en la práctica que nadie pensó que podía hacer un poco más ... obtener mucho más.
  • O nadie quería gastar ni siquiera un par de ciclos de reloj en tales funciones, porque no analizaron las consecuencias generalizadas descritas, o los desarrolladores de entonces con juegos simples no crearon demanda para ellos. Sin embargo, había mode7 (un algoritmo de trampas para implementar texturas en perspectiva, a través de la salida de piezas de sprites rectangulares en hardware con soporte para escalado fraccional)
  • O no soy lo suficientemente mayor y necesito continuar ...



All Articles