La historia del desarrollo de The Light Remake. Parte 1





¡Saludos lector! Mi nombre es Sergey, soy un desarrollador de juegos de computadora independiente. Ya tengo varios proyectos independientes en mi cartera, algunos de los cuales fueron autoeditados en Steam. El juego Light or The Light, lanzado en 2012, fue mi primer bolígrafo y pionero en el mundo del desarrollo de juegos. El proyecto se distribuyó de forma gratuita, pero la reacción del público y los comentarios de los jugadores me motivaron mucho para seguir trabajando. “La Luz” se ha convertido para mí en algo así como una parábola filosófica sobre la humanidad y su destino. La trama es abstracta y no persigue ningún objetivo específico, es solo una oportunidad para reflexionar sobre un tema amplio.



Dado que el juego original nunca llegó al lanzamiento en Steam, decidí corregir esta omisión y en junio de 2019 comencé una reelaboración a gran escala del proyecto para que pudiera coincidir con su jugabilidad y visualmente y ser considerado un juego completo.







¿De qué estamos hablando?



Este artículo se centrará específicamente en el proyecto "Light" y en el trabajo realizado relacionado con la migración del juego a una versión más reciente del motor Unity. Esto implica muchos matices técnicos. El artículo se presentará en dos partes.



Parte 1



La versión original del juego se creó en Unity 4.2 en 2012. Luego en mi campo de información todavía no se hablaba de materiales PBR, pruebas de reflejos y otros métodos que son actualmente relevantes. Los sombreadores básicos en Unity eran muy simples y no muy realistas. Por supuesto, se podrían agregar muchos elementos adicionales, como reflejos de Fresnel, pero la programación de sombreadores fue un misterio para mí. Los sombreadores principales utilizados fueron Normal Bumped Specular y AlphaTest diffuse para objetos con transparencia (hojas de árboles, rejillas metálicas rizadas).



No había sombras de tiempo de escarcha, casi toda la iluminación se convirtió en textura y la resolución de estas sombras fue muy baja en algunos lugares. Hornear la luz encima de todo lo demás redujo el efecto de golpe del sombreador Bumped Specular a casi cero, haciendo que los objetos parecieran más cartón plano en una inspección más cercana.



La imagen se transformó significativamente por los efectos posteriores en la cámara, en particular Bloom y Color Correction. Agregaban color y variedad, aunque eran demasiado intrusivos en algunos lugares.







En el momento de crear este proyecto, todavía tenía ideas vagas sobre la optimización, el procesamiento por lotes (combinar en una malla), la oclusión, la eliminación selectiva (cortar objetos invisibles), etc. Pero debido a que técnicamente la escena no estaba cargada con algo complicado, no contaba con iluminación riltime, césped con canal alfa, etc. - el juego salió bastante optimizado y funcionó bien en hardware débil, dando una imagen agradable para 2012.



Después de 7 años, miras cualquiera de tus creaciones con otros ojos. Las tecnologías han avanzado mucho, las herramientas han cambiado, las últimas versiones del motor Unity son significativamente diferentes de sus predecesoras. En relación con todo lo anterior, transferir el proyecto de la versión 4 a la versión 2017 (decidí detenerme en él por varias razones) es un trabajo bastante largo y laborioso. Además, dado que el proyecto original no podía llamarse un juego completo (la mayoría de las acciones del juego se llevaban a cabo utilizando un script con una función de activación), era necesario escribir toda la lógica desde cero, interacción con objetos, inventario, sistema de menús, sistema. guardados, logros, configuraciones, etc. En general, me esperaba una gran cantidad de trabajo.



Comienzo. Sombreadores y luz



Lo primero que desmoraliza al abrir un proyecto en un nuevo motor es que todo el visual está roto. Muchos sombreadores y efectos de publicación que se importaron de fuentes de terceros dejan de funcionar. Los sombreadores que continúan funcionando se ven ligeramente diferentes. La iluminación en la escena cambia, los mapas de luz vuelan, todo debe recalcularse.







Nuevo estándar



Se decidió comenzar reemplazando los viejos sombreadores con un nuevo estándar PBR. En el artículo anteriorsobre el desarrollo de 35MM, ya mencioné un nuevo tipo de sombreadores PBR (Physically Based Rendering), que implican un correcto renderizado físico. El nuevo material Standard ya no tiene los habituales o.Gloss y o.Specular de las versiones anteriores, aquí tenemos un mapa de metalicidad (o.Metallic) y Suavidad. Además, hay más espacios para texturas de varias categorías. Por ejemplo, tenemos la oportunidad de agregar un mapa de oclusión para un sombreado suave. Este efecto es muy útil porque permite enfatizar el volumen y el sombreado en áreas del modelo donde hay menos luz. Sin este mapa y mapa de luz, la textura, los objetos se ven planos y poco realistas.







Existe el mismo Albedo de detalle y Normal de detalle: estos mapas agregan detalles a nuestras texturas existentes, por ejemplo, puede colocar un mapa normal adicional con pequeñas grietas y teñirlo ajustando el grado de influencia. Como resultado, la textura de relieve original de baja resolución aparecerá más detallada. Para algunos materiales, utilicé esta técnica, mientras que otros no cambiaron.







Vegetación



Después de reemplazar los materiales básicos, pasé a la vegetación. La versión original del juego usaba un sombreador de prueba alfa estándar sin especulador y un mapa normal. Por supuesto, este estado de cosas en 2019 no me convenía. Puede comprar o encontrar una solución lista para usar en Internet, hay paquetes completos con sombreadores y modelos listos para usar con muchas características, imitación de mecerse en el viento, etc. Pero, tradicionalmente, trato de resolver estos problemas yo mismo y experimentar. Esto es algo de interés deportivo. Mi nuevo sombreador Vegetable se basa en la referencia de Toon Ramp del tutorial de Unity.



El modelo de iluminación LightingRamp presentado permitió dibujar la silueta de las sombras tanto en el lado iluminado del polígono como en el opuesto. Esto imitaba la capacidad del follaje para transmitir luz: translucidez.







También se puede usar un sombreador similar para renderizar telas transparentes como cortinas.







Desafortunadamente, en este modo, la representación automática de la parte posterior del polígono mediante el método Cull Off no dio un resultado muy correcto, por lo que la Backface tuvo que agregarse manualmente en el editor. A continuación, se agregó el mapa normal y especular al sombreador. No pude usar el modelo de iluminación del sombreador PBR y conectar las sondas de reflexión, pero con la ayuda de máscaras y un mapa de emisiones, se agregó una simulación de oclusión ambiental. Y finalmente, era extremadamente necesario revivir todo y darle movimiento a la vegetación. Con la función Vertex y la misma máscara, las áreas deseadas de las placas de follaje cobran vida. El desplazamiento de vértice se basa en el ejemplo de Extrusión normal con modificador de vértice del manual de Unity.







Puede configurar la velocidad y la amplitud. Por cierto, en estos experimentos, la nueva función para administrar las variables globales de los sombreadores fue útil ... Puede asignar fácilmente cualquier variable o textura a todos los sombreadores necesarios desde el script.







Brillar



El enfoque del dispositivo de iluminación en la escena ha cambiado significativamente. En el original, toda la luz se convertía en mapas de luz y el renderizado funcionaba en modo Adelante. En el remake, un aspecto importante fue el uso de luz en tiempo real para poder cambiar la hora del día. El modo de renderizado se ha cambiado a Diferido. La luz principal (el sol) se utilizó en modo Mixto, la iluminación direccional y las sombras se dibujaron en tiempo real, y la iluminación global se transformó en texturas. Esto hizo posible cambiar el nivel y la dirección de la luz, pero al mismo tiempo retuvo el efecto de la iluminación global suave y los reflejos, que siempre dan a la imagen un realismo extra. Las texturas de mapas de luz no se hornearon para todos los objetos, principalmente para los grandes y más o menos simples. Los barridos pequeños y difíciles de crear se mantuvieron dinámicos y se destacaron con sondas de luz,pruebas de reflexión, o simplemente luz ambiental básica (que se especifica en la configuración de iluminación principal). El horneado se realizó con un lightmapper progresivo.















Día y noche



Para cambiar la hora del día, se creó un sombreador skybox con dos texturas: día y noche. Ambas opciones se complementaron con una función de compensación para simular el movimiento de la nube. También se agregaron las texturas del cielo nocturno y el brillo anómalo para la escena del vuelo de los misiles de combate. Toda esta desgracia fue controlada por un guión especial que rotaba el skybox y el sol, en ciertas posiciones del sol, el color del skybox cambiaba, las texturas se mezclaban usando el método Lerp y el cielo nocturno y las estrellas se revelaban suavemente. El efecto del brillo del cielo después del lanzamiento de los misiles también se agregó en una capa separada.







Para la optimización en el nivel de luz mínimo (aproximadamente 0,1-0,2), las sombras se apagaron suavemente. Para cambiar la hora, era necesario tener en cuenta un par de puntos más importantes. En el escenario había partículas: pelusa de álamo. Su material no reaccionaba a la luz (en ese momento todavía no había encontrado un sombreador adecuado), por lo que el color del material de pelusa tuvo que cambiarse con un guión según la hora del día.



Además, al cambiar la hora, el script ajustó el color deseado para el post-efecto Global Fog, ya que durante el día la niebla debería verse como una neblina gris azulada clara, y por la noche debería tener un tono más oscuro, casi negro.







Modelos y contenido nuevo



La parte principal de la ubicación y los modelos básicos: el modelo del edificio principal, árboles, bancos, farolas se mantuvo original. Muchos otros accesorios se han rehecho total o parcialmente. Se rediseñó el modelo de la lámpara de queroseno, se creó un nuevo generador diesel con elementos animables separados, un nuevo modelo de proyector de cine, etc.















Los edificios cercanos a los que antes era imposible ingresar se han rediseñado y se han puesto a disposición del jugador. También se modificó la distribución interior del edificio principal. Además de reelaborar el contenido anterior, también se agregaron otros nuevos, por ejemplo, un modelo de autobús PAZ, una máquina de juego, una máquina expendedora de refrescos, un rompecabezas: un panel eléctrico, una puerta hermética en el sótano, artículos de inventario, etc. Parte del contenido se creó de forma independiente, algunos de los modelos se subcontrataron.







Para casi todos los objetos para los que se hornearon mapas de luz, se creó manualmente un escaneo UV2, con la ubicación más óptima de los fragmentos por economía. Por ejemplo, para los edificios, todas las áreas de difícil acceso (por ejemplo, techos y paredes de los pisos superiores), que el jugador prácticamente no verá, ocuparon un espacio mínimo en el escaneo.



Efectos y sombreadores personalizados.



Agua







Con cada nuevo proyecto, quiero tener en cuenta los matices a los que antes cerrábamos los ojos. La imagen general se crea a partir de detalles separados e incluso elementos no muy importantes pueden afectar la percepción. Además, es una especie de desafío: mejorar siempre algo con lo que ya he trabajado. Es especialmente satisfactorio encontrar soluciones por su cuenta, en lugar de utilizar activos prefabricados. En todos los proyectos anteriores he trabajado con agua. Como regla general, era un sombreador de vértices bastante simple que no reaccionaba al jugador ni a la iluminación de la escena. Se basó en Mirror Reflection de Unity Wiki, que fue un ejemplo de una implementación de espejo.







La superficie era dinámica por el desplazamiento de los vértices (imitación de ondas), pero siempre demasiado monótona y algo aburrida. Mediante prueba y error para el proyecto Light, logré crear una versión de Surface de un sombreador similar, que, como una muestra, puede: recibir una textura de reflexión especular de un script de Mirror, deformar vértices para simular ondas, escribir una pantalla en una textura Grabpass para crear refracciones bajo el agua, tener bordes Alpha suaves cuando se cruza con la geometría (desvanecimiento de profundidad). Además, para el efecto de reacción del jugador, la información sobre las coordenadas de la posición del jugador se pasa al sombreador. Se dibuja un punto dinámico en el punto de coordenadas, que simula salpicaduras cuando el personaje está directamente en la columna de agua. Lo más importante que permitía el sombreador Surface era recibir iluminación de cualquier fuente de luz. Así, el agua parece más tangible,sustancia volumétrica y te permite jugar con ella mediante efectos de iluminación.







Cáusticos



Otro detalle importante fue la creación del efecto cáustico: reflejos de luz que caen sobre la superficie. En la oscuridad de los túneles del sótano inundados de agua, esta técnica era esencial. El efecto se creó utilizando un objeto Proyector y un material brillante con una textura animada. El sombreador mezcla 2 texturas cáusticas, que se desplazan en diferentes direcciones, dando como resultado un efecto dinámico. En la mayoría de mis sombreadores, para ahorrar dinero, suelo utilizar máscaras de textura que contienen 4 canales (RGBA), cada uno para un propósito específico. El canal R puede tener una textura básica, el canal G tiene puntos de luz más suaves y el canal B tiene una textura de ruido para distorsionar el patrón cáustico.







La superficie del agua tiene un colisionador con una etiqueta especial. Tan pronto como el personaje entra al agua, el guión detecta esto usando el método raycast y enciende suavemente el cáustico. En este caso, también se detallan varias condiciones, como la presencia de un encendedor, una linterna o una lámpara de queroseno cerca de las manos.







Partículas



Se ha implementado un efecto interesante para pequeñas partículas en el aire que son visibles a la luz. La idea en sí se inspiró en el proyecto Homesick, en el que una vez vi algo similar. A cierta distancia, las partículas tienen una textura regular, algo así como la textura de la pelusa de álamo. Pero a medida que se acerca la cámara, la textura en el sombreador cambia suavemente a la segunda versión, lo que recuerda al efecto de desenfoque. En dinámica, se ve bastante bien y las partículas parecen más tangibles.







Como se señaló anteriormente, casi todas las superficies base de la escena utilizan una versión modificada del sombreador Standart PBR. Algunos han agregado máscaras con diferentes opciones de puntos para obtener detalles adicionales sobre las texturas de Albedo. Se agregó una máscara de manchas para simular charcos de lluvia en superficies como asfalto o adoquines. El sombreador de baldosas del piso en el edificio principal tiene un mapa adicional para los reflejos, que el script Mirror representa de manera similar a una superficie de agua. Para la optimización, solo los objetos básicos y grandes se incluyen en la representación de reflejos y, a cierta distancia, la representación de reflejos está desactivada.



Niebla / humo



Un detalle importante que quería tener en cuenta a la hora de crear el remake es la niebla dinámica y el efecto de la iluminación sobre ella, en particular la luz de una linterna. En trabajos anteriores, el sombreador principal para humo y niebla era la mezcla de partículas estándar y sus modificaciones. Este es un sombreador de vértices que es bueno en términos de rendimiento, pero no reacciona a la luz en absoluto. La exhibición de niebla con un material de este tipo siempre será la misma en la sombra y en la luz, no se puede iluminar con una linterna y no siempre se ve atractiva y natural. En las catacumbas subterráneas que había concebido, se suponía que la neblina estaba resaltada por una linterna de la oscuridad, enfatizada por una iluminación dinámica. Para resolver este problema, se utilizó un sombreador de un activo gratuito . El sombreador no puede presumir de un alto rendimiento, pero visualmente hizo frente a su tarea a la perfección.







Calcas



Otro punto importante fue encontrar un sombreador adecuado para las calcas. El juego planeó una gran cantidad de todo tipo de graffiti, que se instalaba con mayor frecuencia utilizando el antiguo complemento del sistema de calcomanías (desde la versión anterior de Unity 4.6). Para grafitis, inscripciones y letreros, se creó un gran atlas de 4096 por 4096. Las imágenes de las calcomanías son translúcidas y se renderizan en modo alfa transparente, por lo que en el caso de la iluminación dinámica no siempre se ven adecuadas, ya que el sombreador alfa estándar no puede recibir sombras.



Para resolver el problema, se creó un sombreador especial de dos pasadas. La primera pasada dibuja las partes oscuras de la imagen, la segunda las partes claras usando el método de fusión Blend DstColor One. Puede que no entienda bien el método de dibujo, por lo que me abstendré de dar explicaciones detalladas, pero logré lograr el resultado deseado: en la sombra, la imagen está enterrada en la oscuridad, y en la luz aparece e incluso juega con los colores. El sombreador de dos pasadas no tuvo ningún efecto en el rendimiento, ya que el sistema de calcomanías inicialmente combina todas las calcomanías en una malla grande. Probablemente haya mejores formas, pero esta opción me conviene perfectamente.











Tierra / hierba



Se creó otro sombreador de dos pasadas para la superficie del suelo. El mismo territorio en la ubicación está hecho por geometría en 3d max. Pero para renderizar la hierba, se creó un terreno adicional. Tuve que ajustar manualmente las alturas del terreno en los lugares correctos para que coincidieran con el terreno. Luego, se desactivó el renderizado del terreno y se aplicaron varias variantes de las mallas de césped preparadas a la superficie con un pincel. El césped nativo en el terreno es terriblemente pesado en la escena en términos de rendimiento, ya que no se agrupa y cada elemento crea una llamada de extracción adicional (tal vez alguien me corrija si me equivoco), pero este método es extremadamente conveniente en términos de trabajo. La densidad del césped no es alta y en aquellos lugares donde no lo es, la sencillez de la superficie es muy llamativa. En relación con esto, como experimento, utilicé un sombreador de dos pasos,que se mencionó anteriormente. La primera pasada es una geometría opaca regular, la segunda es un duplicado ligeramente elevado de la superficie en el modo de prueba Alpha. En términos generales, una copia de la superficie del suelo / césped también se dibuja con transparencia dura y los vértices se desplazan hacia arriba. Este método complementa un poco el césped plano y crea la ilusión de detalles y volumen adicionales.







Luz fuera de la ventana



Se colocaron sprites translúcidos de un solo lado en algunos lugares fuera de las ventanas del edificio principal para simular reflejos. Además, el efecto posterior de Niebla global tiene un parámetro de niebla blanca brillante, que se activa cuando el héroe se adentra más en el edificio. Es decir, cuando el personaje se encuentra en los pasillos oscuros de la caja, el ambiente exterior adquiere con suavidad un brillo blanquecino. Esto crea un efecto artístico bastante hermoso y le permite enfatizar el plan cercano y lejano.







Con esto concluye la primera parte del artículo. Enlace a la segunda parte. ¡Gracias a todos por su atención!



All Articles