A história do desenvolvimento de The Light Remake. Parte 1





Saudações leitor! Meu nome é Sergey, sou um desenvolvedor independente de jogos de computador. Já tenho vários projetos independentes em meu portfólio, alguns dos quais lançados no Steam. O game Light or The Light, lançado em 2012, foi minha primeira caneta e pioneira no mundo do desenvolvimento de games. O projeto foi distribuído gratuitamente, mas a reação do público e o feedback dos jogadores me motivaram a continuar trabalhando. “The Light” tornou-se para mim algo como uma parábola filosófica sobre a humanidade e seu destino. O enredo é abstrato e não persegue objetivos específicos, é apenas uma oportunidade para refletir sobre um tema amplo.



Como o jogo original nunca foi lançado no Steam, decidi corrigir essa omissão e, em junho de 2019, comecei um retrabalho em grande escala do projeto para que pudesse corresponder à sua jogabilidade e visualmente e ser considerado um jogo completo.







Sobre o que estamos conversando?



Este artigo se concentrará especificamente no projeto "Light" e no trabalho realizado relacionado ao porte do jogo para uma versão mais recente do motor Unity. Isso implica muitas nuances técnicas. O artigo será apresentado em duas partes.



Parte 1



A versão original do jogo foi construída no Unity 4.2 em 2012. Então, no meu campo de informação ainda não havia conversas sobre materiais PBR, testes de reflexão e outros métodos atualmente relevantes. Shaders básicos no Unity eram muito simples e não muito realistas. Claro, muitos elementos adicionais poderiam ser adicionados, como reflexos de fresnel, mas a programação de shader era um mistério para mim. Os principais shaders usados ​​foram Normal Bumped Specular e AlphaTest diffuse para objetos com transparência (folhas de árvore, grades de metal onduladas).



Não havia sombras em tempo de riltime, quase toda a iluminação era cozida em textura e a resolução dessas sombras era muito baixa em alguns lugares. Assar a luz em cima de tudo o mais reduziu o efeito de aumento do sombreador Bumped Specular para quase zero, fazendo com que os objetos pareçam mais como papelão plano em uma inspeção mais próxima.



A imagem foi significativamente transformada por pós-efeitos na câmera, em particular Bloom e Color Correction. Eles adicionaram cor e variedade, embora fossem muito intrusivos em alguns lugares.







No momento de criar este projeto, eu ainda tinha ideias vagas sobre otimização, lote (combinação em uma malha), oclusão - seleção (corte de objetos invisíveis), etc. Mas devido ao fato de que tecnicamente a cena não era carregada com algo complicado, não possuía iluminação de riltime, grama com canal alfa, etc. - o jogo saiu bastante otimizado e funcionou bem em um hardware fraco, dando uma imagem agradável para 2012.



Após 7 anos, você vê qualquer uma de suas criações com olhos diferentes. As tecnologias avançaram muito, as ferramentas mudaram, as versões mais recentes do motor Unity são significativamente diferentes de seus predecessores. Em conexão com todos os itens acima, a transferência do projeto da versão 4 para a versão 2017 (decidi parar por uma série de razões) é um trabalho bastante longo e trabalhoso. Além disso, dado o fato de que o projeto original não poderia ser chamado de um jogo completo (a maioria das ações no jogo foram realizadas usando um script com uma função de gatilho), foi necessário escrever toda a lógica do zero, interação com objetos, inventário, sistema de menu, sistema salva, conquistas, configurações, etc. Em geral, um volume de trabalho muito grande me esperava!



Começar. Shaders e luz



A primeira coisa que é desmoralizante ao abrir um projeto em um novo motor é que todo o visual está quebrado. Muitos shaders e efeitos de postagem importados de fontes de terceiros param de funcionar. Os sombreadores que continuam funcionando parecem um pouco diferentes. A iluminação na cena muda, mapas de luz voam, tudo precisa ser recalculado.







Novo padrão



Foi decidido começar substituindo os shaders antigos por um novo padrão PBR. No artigo anteriorno desenvolvimento do 35MM, já mencionei um novo tipo de shaders PBR (Physically Based Rendering), que implica renderização física correta. O novo padrão de material não possui mais os usuais o.Gloss e o.Specular das versões anteriores, aqui temos um mapa de metalicidade (o.Metallic) e Suavidade. Além disso, existem mais slots para texturas de várias categorias. Por exemplo, temos a oportunidade de adicionar um mapa de oclusão para sombreamento suave. Este efeito é muito útil porque permite enfatizar o volume e o sombreamento em áreas do modelo onde há menos luz. Sem este mapa e mapa de luz - a textura, os objetos parecem planos e irrealistas.







Existe o mesmo Detalhe Albedo e Detalhe Normal - esses mapas adicionam detalhes às nossas texturas existentes, por exemplo, você pode colocar um mapa normal adicional com pequenas rachaduras e tingi-lo ajustando o grau de influência. Como resultado, a textura de relevo de baixa resolução original aparecerá mais detalhada. Para alguns materiais, usei essa técnica, enquanto outros não mudaram.







Vegetação



Depois de substituir os materiais básicos, passei para a vegetação. A compilação original do jogo usava um sombreador Alpha Test padrão sem um especulador e um Mapa Normal. Claro, esse estado de coisas em 2019 não combinava comigo. Você pode comprar ou encontrar uma solução pronta na internet, são pacotes inteiros com shaders e modelos prontos com muitos recursos, imitação de balançar ao vento, etc. Mas, tradicionalmente, tento descobrir essas questões sozinho e experimento. Isso é algo de interesse esportivo. Meu novo sombreador Vegetable é baseado na referência Toon Ramp do tutorial do Unity.



O modelo de iluminação LightingRamp apresentado permitiu desenhar a silhueta das sombras tanto no lado iluminado do polígono, quanto no lado oposto. Isso imitou a capacidade da folhagem de transmitir luz - translucidez.







Um sombreador semelhante também pode ser usado para renderizar tecidos transparentes, como cortinas.







Infelizmente, neste modo, a renderização automática do verso do polígono usando o método Cull Off não deu um resultado muito correto, então o Backface teve que ser adicionado manualmente no editor. Em seguida, o mapa Normal e Especular foi adicionado ao sombreador. Não pude usar o modelo de iluminação do shader PBR e conectar as sondas de reflexão, mas com a ajuda de máscaras e o mapa de emissão adicionei a imitação de oclusão de ambiente. E por último, era preciso reviver tudo e dar movimento à vegetação. Com a função Vertex e a mesma máscara, as áreas desejadas das placas de folhagem ganham vida. O deslocamento do vértice é baseado no exemplo de extrusão normal com modificador de vértice do manual do Unity.







Você pode definir a velocidade e amplitude. A propósito, nesses experimentos, a nova função para gerenciar as variáveis ​​globais dos shaders foi útil ... Você pode facilmente atribuir qualquer variável ou textura a todos os shaders necessários do script.







Brilho



A abordagem do próprio dispositivo de iluminação na cena mudou significativamente. No original, toda a luz era incorporada em mapas de luz e a renderização funcionava no modo Forward. No remake, um aspecto importante foi o uso de luz em tempo real para poder mudar a hora do dia. O modo de renderização foi alterado para Adiado. A luz principal (o sol) foi usada no modo Misto, a iluminação direcional e as sombras foram desenhadas em tempo real e a iluminação global foi incorporada às texturas. Isso tornou possível alterar o nível e a direção da luz, mas ao mesmo tempo manteve o efeito de iluminação global suave e reflexos, que sempre dão à imagem um realismo extra. Texturas de Lightmap não foram preparadas para todos os objetos, principalmente para os grandes e mais ou menos simples. Varreduras pequenas e difíceis de criar permaneceram dinâmicas e foram destacadas com sondas de luz,testes de reflexão, ou apenas luz ambiente básica (que é especificada nas configurações de iluminação principais). O cozimento foi feito com um lightmapper progressivo.















Dia e Noite



Para alterar a hora do dia, um sombreador skybox foi criado com duas texturas: dia e noite. Ambas as opções foram complementadas com uma função de deslocamento para simular o movimento da nuvem. As texturas do céu noturno e o brilho anômalo para o cenário do vôo dos mísseis de combate também foram adicionados. Toda essa desgraça era controlada por um script especial que girava a skybox e o sol, em certas posições do sol, a cor da skybox mudou, as texturas foram misturadas usando o método Lerp e o céu noturno e as estrelas foram revelados suavemente. O efeito do brilho do céu após o lançamento dos mísseis também foi adicionado em uma camada separada.







Para otimização no nível mínimo de luz (cerca de 0,1-0,2), as sombras foram suavemente desligadas. Para alterar o horário, foi necessário levar em consideração mais alguns pontos importantes. No palco havia partículas - penugem de choupo. O material deles não reagia à luz (naquela época eu ainda não tinha encontrado um shader adequado), então a cor do material fluff teve que ser alterada com um script dependendo da hora do dia.



Além disso, ao alterar o horário, o script ajustou a cor desejada para o pós-efeito Global Fog, já que durante o dia a neblina deve se parecer com uma névoa cinza-azulada clara, e à noite deve ter um tom mais escuro, quase preto.







Modelos e novos conteúdos



A parte principal da localização e modelos básicos: o modelo do edifício principal, árvores, bancos, postes permaneceram originais. Muitos outros adereços foram completamente ou parcialmente refeitos. O modelo da lâmpada de querosene foi redesenhado, um novo gerador a diesel com elementos animáveis ​​separados foi criado, um novo modelo de projetor de cinema, etc.















Edifícios próximos, que antes eram impossíveis de entrar, foram redesenhados e disponibilizados para o jogador. O layout interno do edifício principal também foi alterado. Além de retrabalhar o conteúdo antigo, novos também foram adicionados, por exemplo, um modelo de ônibus PAZ, uma máquina de jogos, uma máquina de refrigerante, um quebra-cabeça - um painel elétrico, uma porta hermética no porão, itens de estoque, etc. Parte do conteúdo foi criado de forma independente, alguns dos modelos foram terceirizados.







Para quase todos os objetos para os quais mapas de luz foram preparados, uma varredura UV2 foi criada manualmente, com a localização ideal de fragmentos para economia. Por exemplo, para edifícios, todas as áreas de difícil acesso (por exemplo, tetos e paredes de andares superiores), que o jogador praticamente não verá, ocuparam um espaço mínimo na varredura.



Efeitos e sombreadores personalizados.



Água A







cada novo projeto, quero levar em conta as nuances para as quais fechamos os olhos anteriormente. O quadro geral é criado a partir de detalhes separados e mesmo elementos não muito importantes podem afetar a percepção. Além disso, é uma espécie de desafio - sempre melhorar algo com o qual já trabalhei. É especialmente satisfatório encontrar soluções por conta própria, em vez de usar recursos prontos. Em todos os projetos anteriores, trabalhei com água. Como regra, era um shader de vértice bastante simples que não reagia ao jogador e à iluminação da cena. Foi baseado no Mirror Reflection do Unity Wiki, que foi um exemplo de implementação de espelho.







A superfície era dinâmica devido ao deslocamento dos vértices (imitação de ondas), mas sempre muito monótona e um tanto enfadonha. Por tentativa e erro para o projeto Light, consegui criar uma versão Surface de um shader semelhante, que, como uma amostra, pode: receber uma textura de reflexão especular de um script Mirror, deformar vértices para simular ondas, escrever uma tela em uma textura Grabpass para criar refrações subaquáticas, ter bordas Alpha suaves ao cruzar com geometria (desvanecimento de profundidade). Além disso, para efeito de reação ao jogador, as informações sobre as coordenadas da posição do jogador são passadas para o shader. Um ponto dinâmico é desenhado no ponto de coordenada, que simula respingos quando o personagem está diretamente na coluna d'água. A coisa mais importante que o Surface shader permitia era receber iluminação de qualquer fonte de luz. Desta forma, a água parece mais tangível,substância volumétrica e permite brincar com ela usando efeitos de iluminação.







Cáusticas



Outro detalhe importante foi a criação do efeito cáustico - reflexos de luz incidindo sobre a superfície. Na escuridão dos túneis do porão inundados de água, essa técnica era essencial. O efeito foi criado usando um objeto Projector e um material brilhante com uma textura animada. O shader mistura 2 texturas cáusticas, que são deslocadas em direções diferentes, resultando em um efeito dinâmico. Na maioria dos meus shaders, para economizar dinheiro, eu costumo usar máscaras de textura contendo 4 canais (RGBA) - cada um para um propósito específico. O canal R pode ter uma textura básica, o canal G tem pontos de luz mais suaves e o canal B tem uma textura de ruído para distorcer o padrão cáustico.







A superfície da água possui um colisor com uma etiqueta especial. Assim que o personagem entra na água, o script detecta isso usando o método de raycast e liga suavemente a cáustica. Neste caso, várias condições também são explicitadas, como a presença de um isqueiro, lanterna ou lampião a querosene próximo nas mãos.







Partículas



Um efeito interessante foi implementado para pequenas partículas no ar que são visíveis à luz. A ideia em si foi inspirada no projeto Homesick, no qual uma vez vi algo semelhante. A uma certa distância, as partículas têm uma textura regular, algo como a textura de penugem de choupo. Mas, conforme a câmera se aproxima, a textura no shader muda suavemente para a segunda versão, uma reminiscência do efeito de desfoque. Em dinâmica, parece muito bom e as partículas parecem mais tangíveis.







Conforme observado acima, quase todas as superfícies de base na cena usam uma versão modificada do sombreador PBR Standart. Alguns adicionaram máscaras com opções de pontos diferentes para detalhes adicionais sobre as texturas de Albedo. Adicionada uma máscara pontual para simular poças de chuva em superfícies como asfalto ou pedras de pavimentação. O sombreador de ladrilho do prédio principal tem um mapa adicional para reflexos, que são renderizados pelo script Mirror de forma semelhante a uma superfície de água. Para otimização, apenas objetos básicos e grandes são incluídos na renderização de reflexos e, a uma certa distância, a renderização de reflexos é desativada.



Nevoeiro / fumaça



Um detalhe importante que quis levar em consideração ao criar o remake é a névoa dinâmica e o efeito da iluminação sobre ela, em particular a luz de uma lanterna. Em trabalhos anteriores, o sombreador principal para fumaça e névoa era a mistura de partículas padrão e suas modificações. Este é um sombreador de vértice que é bom em termos de desempenho, mas não reage à luz de forma alguma. A exibição de nevoeiro com tal material será sempre a mesma à sombra e à luz, não pode ser iluminada com lanterna e nem sempre tem um aspecto atraente e natural. Nas catacumbas subterrâneas que eu havia concebido, a névoa deveria ser destacada por uma lanterna vinda da escuridão, enfatizada por uma iluminação dinâmica. Para resolver este problema, um sombreador de um Ativo gratuito foi usado . O shader não pode se orgulhar de alto desempenho, mas visualmente cumpriu sua tarefa perfeitamente.







Decalques



Outro ponto importante foi encontrar um shader adequado para os decalques. O jogo planejou muitos tipos de graffiti, que na maioria das vezes eram instalados usando o antigo plug-in do sistema de decalques (desde a versão anterior do Unity 4.6). Para graffiti, inscrições e sinais, foi criado um grande atlas de 4096 por 4096. As imagens nos decalques são translúcidas e renderizadas no modo Alfa transparente, portanto, no caso de iluminação dinâmica, nem sempre parecem adequadas, já que o sombreador alfa padrão não é capaz de receber sombras.



Para resolver o problema, um sombreador especial de duas passagens foi criado. A primeira passagem desenha as partes escuras da imagem, a segunda as partes claras usando o método de mesclagem Blend DstColor One. Posso não entender muito bem o método de desenho, por isso vou me abster de explicações detalhadas, mas consegui chegar ao resultado desejado: na sombra, a imagem fica soterrada na escuridão, e na luz ela aparece e até brinca com as cores. O sombreador de duas passagens não afetou o desempenho, pois o sistema Decal inicialmente combina todos os decalques em uma grande malha. Provavelmente existem maneiras melhores, mas essa opção me cai perfeitamente.











Terra / grama



Outro shader de duas passagens foi criado para a superfície do solo. O próprio território no local é feito pela geometria em 3d max. Mas para renderizar a grama, um terreno adicional foi criado. Tive que ajustar manualmente as alturas do terreno nos lugares certos para combinar com o terreno. Em seguida, a representação do próprio terreno foi desligada e várias variantes das malhas de grama preparadas foram aplicadas à superfície com um pincel. A grama nativa no terreno é terrivelmente pesada na cena em termos de performance, já que não faz batch e cada elemento cria uma chamada de draw adicional (talvez alguém me corrija se eu estiver errado), mas este método é extremamente conveniente em termos de trabalho. A densidade da grama não é alta e nos lugares onde não é, a simplicidade da superfície é muito marcante. Em conexão com isso, como um experimento, usei um sombreador de duas passagens,que foi mencionado acima. A primeira passagem é uma geometria opaca regular, a segunda é uma duplicata ligeiramente elevada da superfície no modo de teste Alpha. Grosso modo, uma cópia da superfície do solo / grama é desenhada adicionalmente com transparência rígida e vértices deslocados para cima. Este método complementa um pouco a grama plana e cria a ilusão de detalhes e volume adicionais.







Luz fora da janela



Sprites translúcidos de um lado foram colocados em alguns lugares fora das janelas do edifício principal para simular os destaques. Além disso, o pós-efeito Global Fog tem um parâmetro de névoa branca brilhante, que é ativado conforme o herói se move mais para dentro do edifício. Ou seja, quando o personagem está nos corredores escuros do gabinete, o ambiente externo adquire suavemente um brilho esbranquiçado. Isso cria um efeito artístico bastante bonito e permite enfatizar o plano próximo e o distante.







Isso conclui a primeira parte do artigo. Link para a segunda parte. Obrigado a todos pela atenção!



All Articles