Cómo casi recorrí carreras en tiempo real en 1997

Me gustaría compartir mis recuerdos de mis intentos de hacer que el "motor de gráficos 3D" "hágalo usted mismo" casi en la era previa a Internet (como si ya hubiera estado allí en algún lugar, por supuesto, pero en realidad no tenía uno). No se pudo descubrir América, la revolución tampoco sucedió, pero hubo mucho esfuerzo, tormento y abanico. Con los años, la memoria de muchos eventos se borra, los detalles desaparecen, las impresiones se desvanecen: con numerosos viajes, la caja del disquete se perdió y no hubo artefactos de los eventos descritos.

Antecedentes


Los últimos 4 años de escolarización tuvieron lugar en la escuela de educación física de Omsk, donde a un niño (excepto educación física y un juramento) se le enseñó el lenguaje C, que, traslapado con el interés en los gráficos en los juegos, me permitió escribir algo, tratando de darme cuenta de lo que vi en los juegos de esa época. . Ya era difícil sorprender con los gráficos 2D, pero Wolf 3D me detuvo por un tiempo. Uno de los camaradas mayores dijo "sí, todo está en los barrotes", y esto me permitió moverme del suelo. Luego me di cuenta de que el algoritmo de Bresenham se puede aplicar para escalar la columna de la imagen y comenzó a funcionar algún tipo de parodia en Wolf3D. No me esforcé en absoluto por crear algo jugable (¡qué vulgaridad!), Me gustó el proceso de implementación de algoritmos gráficos, la sensación de que sabes cómo se hace y cómo puedes hacerlo. En los exámenes finales, elegí tomar informática y presenté la parte "teórica" ​​a los maestros, sorprendiéndolos mucho por la presencia de una práctica. Pero una semana antes del examen, vi Descent, un verdadero juego tridimensional con texturas. Era algo imposible, sabía que había 3DS, pero para hacer una caricatura se necesitaba mucho tiempo, y luego voló ante nuestros ojos.

En la graduación, en lugar de golpear como todos los niños normales, discutí con amigos Duke Nukem (también es columnista), a quien realmente me gustó por su humor y variedad. Y luego un chico me dijo "mira a Quake". Cuando miré el kwaku, decidí que es suficiente para soportarlo, es imposible, son gráficos en 3D reales, sin columnas, y no entiendo cómo se hace.

Yo era experto en geometría


Ahora puede encontrar cualquier información en 5 minutos, pero ¿qué hacer entonces? Tenía libros sobre gráficos en 3D, pero no aclararon la pregunta en absoluto. En la "Duma", todas las caras encienden la pantalla en un trapecio, tirando de la textura se hace estirando las columnas. Pero al mismo tiempo, perdí de vista el hecho de que la no linealidad surge horizontalmente, y de hecho la imagen en la Duma no es completamente realista. Así que me perdí el principio principal de los gráficos en 3D, descubierto por Newton: " linealizarlo ". Lo que se convertirá en la fuente de todos los problemas y lanzamientos posteriores.

Como ya sabemos cómo dibujar un trapecio, "dibujemos" en la pantalla cada faceta triangular. Sí, no se puede pintar con columnas, pero la geometría no es una cosa muy difícil, pasemos un rayo de la cámara a través de cada píxel de la pantalla y descubramos dónde se cruza con la cara. ¡Esto es prácticamente trazado de rayos, solo lite! Cualquier estudiante escribirá esta fórmula en 5 minutos. La ecuación de la línea:

 vecx=k(xs,ys,z0)=k vecS

donde xs, ysEstas son las coordenadas del píxel en el plano de la pantalla, z0esta es la distancia desde la cámara al plano de la pantalla (cámara a cero del sistema de referencia), k- parámetro
La ecuación del plano:

( vecn, vecx)=D

donde n es normal, entonces el parámetro (y por lo tanto las coordenadas) es fácil de encontrar:

k= fracD( vecn, vecs)


Bueno, qué fácil es, ven al reino del dolor de la división. La computadora se pliega bien, se multiplica tolerablemente (no es más que adiciones y cambios), pero división ... La división en mi Pentium tomó 46 ciclos de reloj. Incluso si 320 a 200, incluso si nada más, entonces para cada cuadro necesita 3 millones de medidas. Y solo hay 100 de mi cáñamo, lo que significa que no puedes obtener más de 30 fps en principio. ¿Y si la resolución aumenta 2 veces? 7 fps? Pero el joven entusiasta no estaba avergonzado.

Bueno, digamos que calculamos el punto de intersección con la cara, entonces necesitamos resolver dos problemas:

  1. decida si dibujar una cara en este píxel o si otra cara se superpone
  2. encontrar coordenadas de textura

Ordenar árbol


Por supuesto, sabía sobre el Z-buffer. Pero créanme, el 99% de las personas que conocen el Z-buffer lo imaginan incorrectamente, tal como lo imaginé incorrectamente (habrá una explicación). En cualquier caso, quería evitar cálculos innecesarios (las divisiones son demasiado pesadas), así que decidí usar otra técnica, leer en el libro: árboles de partición de espacio binario, también son árboles BSP. Siempre amé los árboles, el método de clasificación por un árbol siempre me fascinó con su magia, y aquí estaba su variación: depuré 8 horas continuamente, ¡pero pude!

El método permitió clasificar las caras (al mismo tiempo, algunas caras se cortaron en partes) para que, al mostrarlas, primero se dibujaran las caras "cercanas" y luego las distantes. Por lo tanto, si, al dibujar la cara, vi que el píxel ya estaba tomado, entonces podemos pasar con seguridad al siguiente píxel, el problema de orden está resuelto, queda por extraer las texturas.

Textura de papel tapiz de pegamento


U, V coordenadas? No, no he escuchado. Pero no me culpes, porque cuando pegas el fondo de pantalla no piensas lo mismo de ellos. Crees que tienes un borde del fondo de pantalla (el vector de textura horizontal), aquí tienes el otro borde del fondo de pantalla (el vector de textura vertical), ¡los pones en la pared! Entonces, para cada cara, comencé 2 vectores para los bordes de la textura y conociendo el punto de intersección, encontré las coordenadas dentro de la textura.

Necesitamos una trama y efectos.


¡Renderizado ganado, aunque no rápido, pero ganado! ¡Pude hacer gráficos en 3D! ¿Pero qué rendiremos? Necesitamos algún tipo de trama, algunos modelos, necesitamos algún tipo de sonido.

¿Un caminante o un volante? Este caminante fue y no permite sentir toda la belleza 3D, ¡definitivamente una mosca! Habrá nuestro descenso.

Hice una plataforma, puse varios edificios en ella, puse texturas con ventanas en ellas, hice una fuente de caras (parecía genial). ¿Qué vamos a disparar? Le dispararon clavos en el terremoto, no fue genial. Por alguna razón desconocida para los culturólogos en ese momento, la palabra "perno" (que debe ser martillada) era popular, y me di cuenta de que dispararíamos con pernos, resultó que eran tornillos, las ranuras se veían muy bien en los pernos introducidos en el edificio. ".

El enemigo? Bueno, no pude hacer modelos de personas, lo hice ... una ambulancia voladora, casi cúbica, inclinó un poco su parabrisas. Pero la textura se guardó.

Sonidos Los sonidos de disparos y explosiones y el llanto que obtuve de una máquina voladora que tomé de Warcraft, la banda sonora comenzó a sonar. El hombre que vendió el mundo: yo mismo escuché metal, pero sentí pena por mis padres, que tenían que escuchar lo mismo por las noches mientras estaba depurando.
En Windows 95, los sonidos no se mezclaron, pero ella, en beneficio de la universidad, la maestra me contó sobre el subprocesamiento múltiple y escribí el mezclador en una secuencia separada: otro éxito (Windows 98 se lanzará en un año, donde los sonidos se mezclan y esta habilidad secreta será inútil).

¿Es posible hacerlo mejor? Decidí redescubrir la linealización y pensé, ¿qué sucederá si encontramos con precisión las coordenadas de textura para los bordes de la línea, y el interior será una locura? Lo intenté: todo comenzó a funcionar muchas veces más rápido, pero las distorsiones graves comenzaron cerca de los edificios, como en una habitación de espejos torcidos. Corrección de perspectiva: no, no he escuchado.
Bueno, como no he escuchado, entonces no hay nada que ver con eso, y rechacé esta opción.

Casi el final de la historia.


Hacia el final del primer año, me digné a asistir a un curso especial sobre gráficos por computadora y le mostré todo lo que era al maestro. Probablemente estábamos igualmente sorprendidos con él cuando explicó la interpolación lineal de las coordenadas de textura y las normales, el cálculo aproximado de la iluminación, la estimación del error de perspectiva y su corrección, y le mostré algo realmente funcional.

En el segundo año, intenté rehacer todo sobre la base de nuevos conocimientos, pero el año predeterminado fue 98, y vi el segundo terremoto en el acelerador 3D: fue fabulosamente hermoso. Entonces no había dinero de la palabra, el acelerador era como una nave espacial, por alguna razón decidí que no lo tendría en el futuro cercano. Y el interés en la programación gráfica comenzó a desvanecerse rápidamente, pero me entusiasmó la idea de procesar el sonido. Pero esa es otra historia

PS Las coordenadas de textura real cambian de forma no lineal, por velocidad son reemplazadas por lineales. Pero, ¿qué sucede con la coordenada Z y por qué giran Z durante la transformación? La respuesta a esta pregunta viene dada por el Z-buffer.

Source: https://habr.com/ru/post/464045/


All Articles