La historia del desarrollo de The Light Remake. Parte 2





¡Saludos lector! La primera parte del artículo sobre el desarrollo de The Light Remake describió el proceso de portar el juego a la nueva versión de Unity. Hablé un poco sobre los sombreadores y efectos utilizados, qué soluciones se implementaron al trabajar con la luz, qué contenido adicional se creó, qué contenido de la versión anterior se reelaboró, etc. En la segunda parte hablaremos de otros aspectos del desarrollo, de post-efectos, estructura del proyecto, trabajo con sonido, optimización y otros matices.



Parte 2



Efectos posteriores



Al transferir el proyecto a un nuevo motor, se decidió dejar los viejos métodos de implementación de efectos posteriores que se usaban en versiones anteriores de Unity. Trabajar con ellos fue más comprensible para mí y pude hacer los cambios necesarios en el proceso mismo de procesamiento de imágenes.



Gamma



No hubo muchos efectos posteriores en el juego original, pero uno de los más destacados fue la corrección de color y brillo. Luego logré lograr aleatoriamente un agradable brillo blanquecino y una combinación de colores algo fría. La imagen contrastaba y enfatizaba la fantástica atmósfera del lugar. El estilo visual recordaba algo a la paleta de colores de Battlefield 3 en ese momento, lo que me pareció una coincidencia muy afortunada.



Un matiz interesante es que posteriormente, luego del juego original, no logré repetir por completo este efecto, siempre hubo algunas sutilezas que hacían que la imagen no se pareciera a la original. En este sentido, decidí cambiar el esquema de color en el remake a uno más cálido y positivo. La vegetación se volvió más brillante y expresiva, y la atmósfera se asoció más con un sofocante día de verano. Como beneficio adicional, después de completar el juego, agregué la capacidad de activar la corrección de color, similar al original.











Luz volumétrica



Un elemento muy importante en este remake son los post-efectos asociados a la luz. Las versiones anteriores de Unity tenían un efecto de rayos de sol muy lindo en Sun Shaft. Sin embargo, su funcionalidad era limitada, ya que podía vincularse a una sola fuente de luz en la escena.



En algún momento, un efecto de iluminación volumétrica muy entretenido de las luces volumétricas me llamó la atenciónLe permite crear un brillo y rayos muy agradables y densos que pueden provenir de diferentes fuentes. La atmósfera en la escena se vuelve más voluminosa, los objetos comienzan a hundirse en una ligera neblina de aire, que me impresionó mucho. El único inconveniente fue la alta intensidad de recursos del efecto. Sin embargo, decidí usarlo y gracias a la luz volumétrica, logré crear una luz agradable del sol en toda la escena, así como rayos de luz direccionales místicos en ciertos lugares: en el pasillo al comienzo del juego, en una habitación con un gorrión. El efecto también se utilizó para enfatizar los acentos en las farolas que brillaban por la noche, en el episodio con el proyector, en la sala de calderas para amplificar la luz de las ventanas, en la escena final de la ascensión del personaje a la luz.







SSAO y SSR



Los otros efectos más intensos son SSAO (Oclusión ambiental), que crea un sombreado suave en las esquinas y debajo de las superficies, en ninguna parte sin él. También se agregó SSR (Screen Space Reflections), con lo que hubo muchos problemas incluso en la etapa de desarrollo. SSR simula reflejos en superficies brillantes, lo que resulta en bonitos reflejos en azulejos, metal, etc. El problema es que el efecto fue muy fuerte y casi redujo a la mitad el FPS en mi hardware. A través de algunas manipulaciones en el código post-efecto, logré reducir ligeramente la calidad del cálculo y mejorar ligeramente el rendimiento. En general, la velocidad de fotogramas se volvió aceptable, pero en algunas condiciones (por ejemplo, con Vsync habilitado) SSR provocaba congelamientos y tirones periódicos cuando el personaje se movía.







Otros



Además de los efectos enumerados, el proyecto también utiliza Vignette, aberración cromática, mapeo de tonos, antialiasing, niebla global y floración. Para la optimización, la viñeta, la aberración y el mapeo de tonos se han combinado en un solo proceso.







Por cierto, ahora, cuando trabajo con gráficos, a menudo recuerdo mi experiencia personal de estudiar en una escuela de arte, donde nos enseñaron a enfatizar las sombras contrastantes debajo de los objetos, mostrar reflejos en las superficies de los objetos y aplicar una neblina en el horizonte cuando trabajamos con paisajes para enfatizar una perspectiva aérea. ¡Ahora sé que todo fue SSAO, SSR y Global Fog!



¿Cómo funciona?



El proyecto original se montó literalmente sobre la rodilla. En ese momento, no tenía conocimientos de programación y toda la funcionalidad del juego se basaba en unos pocos scripts simples. El principal fue el script de activación de Activate, que encontré en los activos estándar de Unity. Todas las funciones se basaron en el hecho de que el personaje se mete en un disparador, enciende o apaga ciertos objetos y provoca las acciones necesarias. No se trataba de guardar ni de configurar el juego.



Sistema



Por supuesto, para implementar el remake, fue necesario escribir todo el sistema de juego desde cero: el sistema de control, los guardados, la configuración y la mecánica del juego. En general, la construcción competente del sistema de proyectos sigue siendo una tarea difícil para mí. Normalmente, creo un objeto de sistema base con varios objetos secundarios. Cada uno de ellos realiza su propio grupo de funciones y todos están relacionados.



Dado que el juego consiste básicamente en una ubicación, decidí no molestarme en cargar escenas, prefabricados y componentes, y coloqué todo lo que necesitaba en una escena principal. Se crearon controladores que administran todo lo que necesitas, cambian configuraciones, guardan el juego y leen los datos guardados, leen los textos de subtítulos y notas de un archivo especial en la raíz del juego, etc. Para facilitar la implementación, como en juegos anteriores, se decidió utilizar el sistema de guardado en los puntos de control. La ubicación contiene varias docenas de objetos interactivos como puertas, elementos de juego, lámparas de queroseno, etc. Para cada guardado, es necesario registrar los identificadores de estado del objeto, que suelen ser una variable Int. Por ejemplo, la puerta está cerrada y bloqueada con una llave: DoorOpen - o, DoorLocked - 1.No entraré en detalles sobre el tema de la programación, ya que mis habilidades en esta área son algo específicas y superficiales, sin embargo, son suficientes para implementar mis propios proyectos.



Dos finales



Una tarea interesante para mí fue la implementación de la puntuación virtual para lograr una de las opciones finales. Quería introducir algún elemento del desafío en la jugabilidad del remake, y se me ocurrió la idea de conectar esta idea con el símbolo principal del juego: la luz. Se decidió crear un contador que analizará el nivel de luz ambiental mediante varios parámetros. El final del juego dependerá de cuánto tiempo permanezca el jugador en un lugar iluminado o al sol. La primera etapa consiste en recopilar información de las sondas de luz colocadas en la escena y su nivel de luminosidad. Este parámetro se traduce en un promedio y se escribe en una variable flotante.







Además, el guión tiene en cuenta la presencia de fuentes de luz adicionales cercanas, por ejemplo, lámparas, luz de ventanas, una linterna encendida o un encendedor en la mano. La presencia de una de las condiciones agrega ciertos valores a los indicadores luminosos ya calculados. Y finalmente, la luz solar directa tiene el efecto más poderoso sobre el personaje. Desde una fuente de luz solar, se dispara un raycast al personaje, que le dice al sistema si el jugador está al sol.



Todos estos valores se suman y cuentan mediante un contador, que al final del juego determina cómo será la final. Si el jugador rara vez visitó el cielo abierto, bajo los rayos directos, rara vez usó una linterna y un encendedor, entonces el parámetro final será bajo. El sistema no siempre determina con precisión el nivel de iluminación, pero en general hace frente a su tarea. Para depurar y como elemento adicional, hay manchas de pintura reflectante en la tubería de metal en las manos del personaje, que es un indicador de iluminación.



Subtitulado y localización



Para el remake, se elaboró ​​un nuevo enfoque de la localización y, en general, la visualización de textos y mensajes. Más precisamente, este enfoque se utilizó anteriormente en el proyecto del Séptimo Sector, sin embargo, el contenido era mucho menor. Se toma como base el método de guardar datos en un documento hml. Toda la información de texto para la localización se almacena inicialmente en un archivo xml en la raíz del juego. Los mensajes se dividen en grupos y se etiquetan individualmente, pertenecen a determinadas categorías y determinados idiomas. Para un salto de línea, decidí usar el carácter (*) y comenzar un nuevo mensaje (#).







En el momento adecuado (al elegir un idioma y comenzar una escena), el controlador lee toda la información del texto, la divide en líneas y grupos separados y la escribe en una especie de biblioteca o diccionario. Luego, los scripts individuales leen esta información, por ejemplo, al abrir un menú o activar subtítulos en la pantalla. El sistema me pareció personalmente conveniente y, lo más importante, comprensible. Le permite ingresar fácilmente un nuevo idioma y realizar cambios en el texto existente.



Sonido



Algunos de los sonidos básicos proceden de las fuentes originales. Ambiente, canto de pájaros, sonido de proyector de películas, etc. se decidió salir para preservar el reconocimiento del proyecto. Sin embargo, se requería mucho contenido nuevo. Se han añadido los sonidos del propio personaje, pasos, objetos activados, la respiración del héroe en determinados momentos, el efecto de un latido, etc. Se agregó más variedad al conjunto de sonidos ambientales, se agregaron chirridos de saltamontes, sonidos aleatorios de objetos cayendo y portazos. Por cierto, me inspiré en los paisajes del nuevo Half Life Alyx para agregar el ruido de cigarras o saltamontes, en los que el ambiente de un caluroso día de verano es muy fresco. Disfruté escuchando y viendo las grabaciones Ambient de City17 en Youtube durante un tiempo.



La mayoría de los sonidos se tomaron prestados de bibliotecas gratuitas. Los fragmentos se combinaron entre sí, se aplicaron efectos, se cambió la velocidad, etc.



La creación de la banda sonora se convirtió en toda una capa de trabajo responsable y minucioso. Las composiciones del proyecto original no tenían licencia, era un conjunto de pistas de Ludovico Einaudi, el compositor Thomas Newman y el OST del juego “Afraid of monsters”. Sin embargo, solemos meternos en el alma de lo que escuchamos por primera vez, por ejemplo, los originales de los temas suelen parecer más agradables que sus remixes, al menos para mí. En este caso, al crear nuevas composiciones, realmente quería preservar el estilo y la atmósfera de las pistas originales. Me parece que el compositor Dmitry Nikolaev, con quien habíamos trabajado anteriormente en el juego de 35MM, hizo un excelente trabajo con esta tarea. Me impresionó especialmente la nueva mirada a la composición dinámica que sonó durante la proyección de la película en la sala de conferencias. La pista conserva el estilo enérgico y ligeramente psicodélico original,empezó a sonar fresco, pero reconocible. Por cierto, la película en sí también fue muy revisada e incluyó mucho material nuevo. El contenido del video se eligió con más cuidado para evitar la infracción de los derechos de autor, y algunos de los fragmentos se crearon de forma independiente.



El enlace muestra el video original utilizado en el juego original de 2012.







Aunque no hay diálogo en el juego, había un lugar para la actuación de voz. La grabación contó con la asistencia de Vsevolod Petrykin, quien había participado previamente en el proyecto 35MM y quien le dio su voz al personaje principal Petrovich. Su discurso se puede escuchar por los altavoces en el momento en que aparecen los aviones, desde el auricular del teléfono en el episodio con el lanzamiento de misiles y en la radio, en el segundo piso del edificio principal.



Mejoramiento



La optimización se ha convertido en uno de los temas y tareas más dolorosos en el trabajo de la nueva versión. Dio la casualidad de que casi todos los proyectos que creé anteriormente en la versión anterior de Unity (4.6) eran bastante simples en términos de carga en el hardware. Jugar a 35MM en mi GTX 970 en algunos lugares dio 200-300 fps en escenas bastante complejas y ocupadas. El Light original, construido sobre una versión incluso anterior del motor, mostró un FPS aún más alto. Pero al cambiar a Unity 2017, la velocidad de fotogramas se redujo 2-3 veces. Está claro que la escena se ha vuelto mucho más compleja, se han añadido errores de cálculo de luz y reflejos, post efectos adicionales, etc. pero no esperaba una disminución tan dramática en el rendimiento. El problema es que incluso después de eliminar casi todo el contenido de la escena, mi FPS no superó los 200-300. ¡Este es un escenario medio vacío, Karl!Se ha trabajado mucho para simplificar algo de geometría, crear grupos Lod, configurar la eliminación selectiva de oclusión, etc.







Además, mediante un script, a las cámaras se les asignó una distancia de recorte para ciertas capas. Para la implementación, se utilizó un ejemplo de los manuales de Unity. Se asignaron objetos de diferentes tamaños a capas separadas, que dejan de renderizarse si la cámara está demasiado lejos. Los objetos pequeños como latas, basura, escombros de madera, libros se cortan después de 20-30 metros. Los más grandes, después de 60-80. Todas las medidas anteriores han reducido significativamente el número de Drawcalls. En promedio, el número de llamadas de sorteo en una escena varía de 800 a 2000 DC. El número de polígonos en un marco no supera el millón.







Recorte de luminarias



Como parte de la optimización, se creó un guión especial que, cada 2-3 segundos, determinaba la distancia a pequeñas fuentes de luz dinámicas, como las lámparas de queroseno. Cuando se quitó la cámara de las lámparas, el script las apagó para no cargar el sistema con procesos innecesarios. Además, cuando el personaje descendió al sótano, la fuente de luz solar se apagó. Esto redujo significativamente el número de DrawCalls.



Pocos detalles



  • En los pasillos del sótano, de pie debajo de los pozos de alcantarillado de hormigón con agua goteando, puedes ver gotas nubladas que aparecen en la pantalla (los ojos / gafas del personaje). Simplificado: siempre que el héroe apriete el gatillo y cuando la cámara se dirija hacia arriba, se encienda el prefabricado del sistema de partículas con un material Grabpass embarrado. También en este momento, se pueden observar gotas en la superficie de la tarjeta si la tomas en tus manos.






  • . . « », . . , .






  • , .


  • , , .






  • . “STALKER ” , . , , . , . , / .


  • , — 3 . , , . . .






  • , Half Life Alyx, . , . , . , «», . .






  • , , . , . , Graphics.DrawMeshInstancedIndirect .
  • . , , .








Como puede ver en el artículo, desarrollar su propio proyecto es un proceso muy laborioso. Son noches de insomnio, una búsqueda constante de soluciones, una búsqueda de inspiración, derrota y victoria. Pero trae un gran placer y una sensación de autorrealización. Yo diría que esto es más que un trabajo, es una forma de vida. Nuestras mentes son asombrosas y capaces de crear cosas asombrosas que a veces no se pueden comparar con la realidad. Hay todo un universo en el cráneo de cualquier persona, y es maravilloso, es maravilloso que este universo pueda mostrarse de alguna manera a través de tu actividad, ya sea una película o un juego de computadora. Cada trabajo es algo personal, creado a través de un trabajo duro y agotador, algo muy importante y valioso, ante todo para uno mismo.



¡Les deseo a todos buena suerte, inspiración creativa y alto FPS!



All Articles