En el recientemente lanzado juego Marvel's Spider-Man, muchos edificios tienen interiores fuera de las ventanas. Se ven geniales, pero parece que se implementaron utilizando una representación astuta: la geometría de los interiores en realidad no existe y es generada por un sombreador. No vi ninguna declaración oficial de Insomniac sobre cómo lo hicieron, pero en función de cómo se ve el efecto, es muy probable que se implementó la técnica de
mapeo interior que se me ocurrió en 2007 mientras trabajaba en la disertación. No escribí sobre eso en el blog antes, así que ahora es el momento adecuado para explicar el curioso sombreador que se me ocurrió.
Comencemos viendo el juego Marvel's Spider-Man. El juego se ve increíble. El sitio web de Kotaku grabó un video separado en Windows:
Como puede ver aproximadamente a los 40 segundos del video, de hecho, las habitaciones no son parte de la geometría: donde la ventana obviamente debería estar, la puerta está ubicada. Además, mirando en una habitación desde diferentes ángulos del edificio, vemos un interior diferente. En algunos casos, incluso hay una pared alrededor de la esquina del edificio. Todo esto nos hace comprender que las habitaciones son imitadas. Sin embargo, desde un punto de vista en perspectiva, se muestran correctamente y tienen una profundidad real.
Creo que los inconvenientes de tales salas no son muy importantes durante el juego, porque los jugadores generalmente no estudian las salas tan de cerca: los interiores son solo un telón de fondo y no un tema de estudio cuidadoso. Creo que esta forma de crear habitaciones agrega profundidad y vida a la ciudad sin gastar demasiados recursos.
Para ahorrar recursos, los edificios en los juegos a menudo no tienen interiores, como se puede ver en la captura de pantalla de GTA VEn primer lugar, quiero explicar que mi publicación no es una queja: estoy encantado de que mi equipo se haya utilizado en un juego a gran escala y de ninguna manera acusar a Insomniac de robo. Como dije en la primera publicación sobre mapeo interior, sería un honor para mí si alguien usa esta técnica. Si Insomniac realmente aprovechó mi idea en su técnica, entonces creo que es genial. Si ella no lo usó, entonces parece que se le ocurrió algo extrañamente similar. Entonces estaría interesado en cómo se hizo esto.
Entonces, ¿cómo funciona el mapeo interior? La idea es que el edificio en sí no contenga ninguna geometría adicional. Los interiores solo existen en el sombreador. Este sombreador realiza una emisión de rayos con paredes, techos y pisos para calcular lo que el jugador debería ver en el interior.
De izquierda a derecha: solo ventanas con reflejos, ventanas con mapeo interior, modelo de estructura metálica: el mapeo interior no agrega ningún polígono.El rayo utilizado para raycast es simplemente un rayo de la cámara al píxel. El píxel que representamos se encuentra en el exterior del edificio, por lo que usamos solo la parte de la viga después del píxel, porque esta es la parte que está realmente dentro del edificio.
Raycasting puede parecer una operación complicada y costosa, pero en este caso particular es realmente muy simple y rápido. El truco es que puede agregar una restricción simple: con el mapeo interior, los techos y los pisos están a una distancia constante. Sabiendo esto, podemos calcular fácilmente en qué habitación estamos y dónde se encuentran el piso y el techo en esta habitación. Los techos y los pisos son planos geométricos infinitos. Calcular la intersección entre un plano infinito y un rayo toma solo unos pocos pasos y gasta pocos recursos.
La sala tiene 6 planos: techo, piso y 4 paredes. Sin embargo, necesitamos considerar solo tres de ellos, porque sabemos en qué dirección estamos mirando. Por ejemplo, si miramos hacia arriba, entonces no necesitamos revisar el piso de abajo, porque veremos el techo de arriba. Del mismo modo, en lugar de 4 paredes, debemos considerar solo dos en la dirección en la que estamos mirando.
Para determinar lo que vemos, necesitamos calcular la intersección del rayo con cada uno de estos tres planos. La intersección con el haz más cercano a la cámara nos dice cuál de los planos vemos en este píxel. Luego usamos el punto de intersección como la coordenada de la textura para encontrar el color del píxel. Por ejemplo, si la viga se cruza en la posición (x, y, z) con el techo, entonces usamos (x, y) como la coordenada de textura e ignoramos z.
Aquí agregué una buena optimización: parte de los cálculos de intersección para cada uno de los tres planos se pueden realizar simultáneamente. Los sombreadores utilizados trabajaron con float4 a la misma velocidad que con float, por lo que gracias al inteligente empaquetado de variables, fue posible intersectar los tres rayos con planos al mismo tiempo. Esto me ahorró algunos recursos y me ayudó a lograr una alta velocidad de cuadros con el mapeo interior incluso en 2007. Me dijeron que las tarjetas de video modernas con float funcionan más rápido que con float4; significa que en el hardware actual esta optimización ya no funciona.
El mapeo interior sin texturas de ventana muestra que las habitaciones se representan con la perspectiva y las texturas correctas, aunque no se requiere geometría adicional.Puedes aprender más sobre mapeo interior en
mi artículo . Este artículo fue publicado en la Conferencia Internacional de Gráficos por Computadora en 2008. Tener esta publicación revisada por pares es mi primera (y única) solicitud para el orgulloso título de científico. Este artículo también describe experimentos adicionales para agregar detalles, por ejemplo, cambiando la distancia entre paredes para habitaciones de tamaño desigual y seleccionando texturas al azar de un atlas de texturas para una mayor variabilidad de la habitación. También describe en detalle las dos variaciones que se muestran en las imágenes a continuación.
La iluminación de las habitaciones se puede encender y apagar dinámicamente para simular un cambio de día y de noche. Esto se hace usando la textura de ruido de la que estamos leyendo, usando el índice de la habitación como coordenadas de textura.Como solo emitimos rayos en el plano, todas las habitaciones son cuadrados simples con texturas. Todos los muebles de la habitación estarán en la textura, lo que significa permanecer planos. En Spiderman, esto se nota cuando te acercas a la cámara: las mesas en las habitaciones son en realidad texturas planas en las paredes. Como puede ver en la imagen a continuación, podemos complementar nuestra técnica con una o más capas de textura adicionales por habitación, pero esto está asociado con costos de rendimiento adicionales.
Al realizar el trazado de rayos de otro plano paralelo a la superficie exterior del edificio, puede agregar muebles y personas a la habitación. Sin embargo, seguirán siendo planos.Después de la publicación de esta publicación, uno de los programadores Simcity (2013) me dijo que la técnica de mapeo interior también se usó en este juego. En ella, se ve muy bien, y los desarrolladores grabaron un gran video al respecto. Refinaron mi idea original guardando todas las texturas en una textura y agregando habitaciones de diferentes profundidades. La parte de mapeo interior comienza a las 1:00 a.m .:
Si desea explorar esta técnica más profundamente, puede descargar
mi demo de mapeo interior con código fuente. Si trabaja en Unreal Engine 4, puede encontrar el mapeo interior como una función estándar del motor en forma de la función InteriorCubeMap.
¡Después de tantos años, es genial finalmente ver que mi técnica de mapeo interior se usa en la producción de videojuegos a gran escala! Si estás familiarizado con juegos que usan algo similar, escríbeme al respecto.