id Tech 1 , también conocido como motor Doom , es el motor de juego utilizado en los videojuegos de id Software Doom y Doom II: Hell on Earth . También se utiliza en Heretic , Hexen: Beyond Heretic , Strife: Quest for the Sigil , Hacx: Twitch 'n Kill , Freedoom y otros juegos producidos por licenciatarios. Fue creado por John Carmack , con funciones auxiliares escritas por Mike Abrash , John Romero , Dave Taylor y Paul Radek. Originalmente desarrollado en computadoras NeXT , [3] fue portado a MS-DOS y sistemas operativos compatibles para el lanzamiento inicial de Doom y luego fue portado a varias consolas de juegos y sistemas operativos .
El código fuente de la versión Linux de Doom fue lanzado al público bajo una licencia que otorgaba derechos para uso no comercial el 23 de diciembre de 1997, seguido por la versión Linux de Doom II aproximadamente una semana después, el 29 de diciembre de 1997. [4] [5] El código fuente fue posteriormente relanzado bajo la Licencia Pública General GNU v2.0 o posterior el 3 de octubre de 1999. [6] [7] Las docenas de puertos fuente no oficiales de Doom que se han creado desde entonces permiten que Doom se ejecute en sistemas operativos previamente no compatibles y, a veces, expanden radicalmente la funcionalidad del motor con nuevas características.
Aunque el motor renderiza un espacio 3D, ese espacio se proyecta desde un plano de planta bidimensional . La línea de visión siempre es paralela al suelo, las paredes deben ser perpendiculares a los pisos y no es posible crear estructuras de varios niveles o áreas inclinadas (pisos y techos con diferentes ángulos). A pesar de estas limitaciones, el motor representó un salto tecnológico con respecto al motor 3D Wolfenstein anterior de id . El motor Doom fue posteriormente renombrado [ cita requerida ] a "id Tech 1" para categorizarlo en una lista de la larga línea de motores de juego de id Software . [8]
El motor de Doom separa la renderización del resto del juego. El motor gráfico funciona tan rápido como puede, pero el mundo del juego funciona a 35 cuadros por segundo independientemente del hardware, por lo que varios jugadores pueden jugar entre sí utilizando computadoras de diferente rendimiento. [9]
Una configuración sencilla que demuestra cómo Doom representa los niveles internamente
Vistos de arriba a abajo, todos los niveles de Doom son en realidad bidimensionales, lo que demuestra una de las principales limitaciones del motor de Doom : no es posible jugar en una habitación tras otra . Sin embargo, esta limitación tiene un lado positivo: se puede mostrar fácilmente un "modo de mapa" que representa las paredes y la posición del jugador, de forma muy similar a la primera imagen de la derecha.
La unidad base es el vértice , que representa un único punto 2D. Los vértices (o "vértices", como se los denomina internamente) se unen para formar líneas , conocidas como "linedefs". Cada linedef puede tener uno o dos lados, que se conocen como "sidedefs". Los sidedefs se agrupan para formar polígonos ; estos se denominan "sectores". Los sectores representan áreas particulares del nivel.
Cada sector contiene una serie de propiedades: altura del piso, altura del techo, nivel de luz, textura del piso y textura del techo. Para tener un nivel de luz diferente en un área en particular, por ejemplo, se debe crear un nuevo sector para esa área con un nivel de luz diferente. Por lo tanto, las definiciones de línea de un solo lado representan paredes sólidas, mientras que las definiciones de línea de dos lados representan líneas de puente entre sectores.
Las sidedefs se utilizan para almacenar texturas de pared ; estas son completamente independientes de las texturas del piso y el techo. Cada sidedef puede tener tres texturas; estas se denominan texturas media, superior e inferior. En las linedefs de un solo lado, solo se utiliza la textura media para la textura de la pared. En las linedefs de dos lados, la situación es más compleja. Las texturas inferior y superior se utilizan para rellenar los huecos donde los sectores adyacentes tienen diferentes alturas de piso y techo: las texturas inferiores se utilizan para los escalones, por ejemplo. Las sidedefs también pueden tener una textura media, aunque la mayoría no la tiene; esto se utiliza para hacer que las texturas queden suspendidas en el aire. Por ejemplo, cuando se ve una textura de barra transparente formando una jaula, este es un ejemplo de una textura media en una linedef de dos lados.
Doom utiliza un sistema conocido como partición binaria del espacio (BSP, por sus siglas en inglés). [10] Se utiliza una herramienta para generar los datos BSP para un nivel de antemano. Este proceso puede llevar bastante tiempo para un nivel grande. Es por esto que no es posible mover las paredes en Doom ; mientras que las puertas y los ascensores se mueven hacia arriba y hacia abajo, ninguno de ellos se mueve lateralmente.
El nivel se divide en un árbol binario : cada ubicación en el árbol es un "nodo" que representa un área particular del nivel (el nodo raíz representa el nivel completo). En cada rama del árbol hay una línea divisoria que divide el área del nodo en dos subnodos. Al mismo tiempo, la línea divisoria divide las definiciones de línea en segmentos de línea llamados "segs". [11]
En las hojas del árbol se encuentran polígonos convexos , en los que no es necesario realizar más divisiones del nivel. Estos polígonos convexos se denominan subsectores (o "SSECTORES") y están vinculados a un sector en particular. Cada subsector tiene una lista de segmentos asociados. [10]
El sistema BSP ordena los subsectores en el orden correcto para su representación. El algoritmo es bastante simple:
El proceso se completa cuando se llena toda la columna de píxeles (es decir, no quedan más espacios vacíos). Este orden garantiza que no se pierda tiempo dibujando objetos que no son visibles y, como resultado, los mapas pueden volverse muy grandes sin ninguna penalización de velocidad.
Todas las paredes de Doom están dibujadas verticalmente; es por esto que no es posible mirar hacia arriba y hacia abajo correctamente. Es posible realizar una forma de mirar hacia arriba/abajo a través de "y-shearing", y muchos puertos de origen de Doom modernos lo hacen, así como juegos posteriores que usan el motor, como Heretic . Básicamente, esto funciona moviendo la línea del horizonte hacia arriba y hacia abajo dentro de la pantalla, lo que en efecto proporciona una "ventana" en un área visible más alta. Al mover la ventana hacia arriba y hacia abajo, es posible dar la ilusión de mirar hacia arriba y hacia abajo. Sin embargo, esto distorsionará la vista cuanto más arriba y más abajo mire el jugador.
El motor Doom renderiza las paredes a medida que recorre el árbol BSP, dibujando subsectores por orden de distancia desde la cámara, de modo que los segmentos más cercanos se dibujen primero. A medida que se dibujan los segmentos, se almacenan en una lista enlazada. Esto se utiliza para recortar otros segmentos renderizados más adelante, lo que reduce el sobredibujo. Esto también se utiliza más adelante para recortar los bordes de los sprites.
Una vez que el motor alcanza una pared sólida (unilateral) en una determinada coordenada x, no es necesario dibujar más líneas en esa zona. Para recortar, el motor almacena un "mapa" de las áreas de la pantalla en las que se han alcanzado las paredes sólidas. Esto permite recortar por completo las partes lejanas del nivel que son invisibles para el jugador.
El formato gráfico de Doom almacena las texturas de las paredes como conjuntos de columnas verticales ; esto es útil para el renderizador, que esencialmente renderiza las paredes dibujando muchas columnas verticales de texturas.
El sistema para dibujar pisos y techos ("pisos") es menos elegante [ ¿según quién? ] que el utilizado para las paredes. Los pisos se dibujan con un algoritmo similar al de relleno por inundación . Debido a esto, si se utiliza un constructor de BSP deficiente, a veces es posible que se produzcan "agujeros" donde el piso o el techo se desangran hasta los bordes de la pantalla, un error visual al que se suele denominar "rastro de baba". [13] Esta es también la razón por la que si el jugador se desplaza fuera del nivel utilizando el truco noclip, los pisos y los techos parecerán extenderse desde el nivel sobre el espacio vacío.
El suelo y el techo se dibujan como "visplanos". Estos representan líneas horizontales de textura, desde un suelo o techo a una altura, nivel de luz y textura determinados (si dos sectores adyacentes tienen exactamente el mismo suelo, estos pueden fusionarse en un único visplano). Cada posición x en el visplano tiene una línea vertical particular de textura que se debe dibujar.
Debido a este límite de dibujar una línea vertical en cada posición x, a veces es necesario dividir los visplanos en múltiples visplanos. Por ejemplo, considere visualizar un piso con dos cuadrados concéntricos . El cuadrado interior dividirá verticalmente el piso circundante. En ese rango horizontal donde se dibuja el cuadrado interior, se necesitan dos visplanos para el piso circundante.
Doom contenía un límite estático en la cantidad de visplanes; si se excedía, se producía un "desbordamiento de visplane", lo que hacía que el juego saliera al modo DOS con uno de dos errores: "¡No más visplanes!" o "desbordamiento de visplane (128 o superior)". La forma más fácil de invocar el límite de visplane es un gran patrón de piso de tablero de ajedrez; esto crea una gran cantidad de visplanes.
A medida que se van renderizando los segmentos, también se van añadiendo visplanes, que se extienden desde los bordes de los segmentos hacia los bordes verticales de la pantalla. Estos se extienden hasta que alcanzan los visplanes existentes. Debido a la forma en que esto funciona, el sistema depende del hecho de que los segmentos se renderizan en orden por el motor general; es necesario dibujar primero los visplanes más cercanos, para que puedan "cortarse" por otros más alejados. Si no se detiene, el suelo o el techo se "desangrarán" hacia los bordes de la pantalla, como se describió anteriormente. Finalmente, los visplanes forman un "mapa" de áreas particulares de la pantalla en las que dibujar texturas particulares.
Si bien los visplanes se construyen esencialmente a partir de "tiras" verticales, la representación de bajo nivel real se realiza en forma de "tramos" horizontales de textura. Una vez que se han construido todos los visplanes, se convierten en tramos que luego se representan en la pantalla. Esto parece ser un compromiso: es más fácil construir visplanes como tiras verticales, pero debido a la naturaleza de cómo aparecen las texturas del piso y el techo, es más fácil dibujarlas como tiras horizontales.
Cada sector dentro del nivel tiene una lista vinculada de elementos almacenados en ese sector. A medida que se dibuja cada sector, los sprites se colocan en una lista de sprites que se dibujarán. Si no están dentro del campo de visión, se ignoran.
Los bordes de los sprites se recortan consultando la lista de segmentos dibujados previamente. Los sprites en Doom se almacenan en el mismo formato basado en columnas que las paredes, lo que nuevamente resulta útil para el renderizador. Las mismas funciones que se utilizan para dibujar paredes también se utilizan para dibujar sprites.
Si bien se garantiza que los subsectores estén en orden, los sprites dentro de ellos no lo están. Doom almacena una lista de sprites que se dibujarán ("vissprites") y ordena la lista antes de renderizar. Los sprites más alejados se dibujan antes que los más cercanos. Esto provoca un cierto exceso de dibujo, pero generalmente es insignificante.
Existe un problema final con las texturas intermedias en las líneas de dos lados, utilizadas en barras transparentes, por ejemplo. Estas se mezclan y se dibujan con los sprites al final del proceso de renderizado, en lugar de con las otras paredes.
El motor Doom alcanzó la mayor parte de su fama como resultado de impulsar el clásico juego de disparos en primera persona Doom , y se utilizó en varios otros juegos. Por lo general, se considera que los "cuatro grandes" juegos con motor Doom son Doom , Heretic , Hexen: Beyond Heretic y Strife: Quest for the Sigil .
En la década de 1990, un puñado de desarrolladores adquirieron licencias para distribuir conversiones totales de Doom , y después del lanzamiento del código fuente en 1997, se produjeron varios títulos independientes en el motor, incluidos freeware , fangames y títulos comerciales. [14]