Eu (Junior_Djjr) fiz algo que eu mesmo dizia ser impossível: eu corrigi o padrão de repetição de texturas do GTA San Andreas!
Você deve estar se perguntando qual “gambiarra” foi usada, mas na verdade a solução é excelente e substitui nada do seu jogo, através de uma técnica de shader chamada de “procedural stochastic texturing“.
O algoritmo é baseado num paper de Thomas Deliot e Eric Heitz publicado em 2019, ambos desenvolvedores da Unity Engine.
Só é utilizado para texturas categorizadas como “stochastic”, ou seja, um padrão natural de grama, concreto etc.
Isto não é novidade se você seque os nossos jogos: Nós usamos isto nos jogos IMPUNES.
Inclusive, isto foi um ponto essencial para o jogo Beetles Underground, pois você é um besouro que fica no chão e pode voar, portanto era necessário uma textura que fique boa vista de perto, e de longe.
E isto é um detalhe importante, mesmo de perto o resultado é excelente:
Fazer isto num mod separado causaria conflito com o SkyGfx, que é uma excelente base para adicionar shaders no GTA SA. Obviamente, com opção no arquivo .ini: “stochasticTexturing=1“.
Será um fork do projeto lançado como “SkyGfx Extended“.
Todas as variações de shaders do SkyGfx foram preservadas, ou seja, você ainda tem o building pipe do PS2 ou Xbox, e detail maps do mobile — que também usam stochastic! Eu só não adaptei para veículos pois não é tão útil e não é amigável adaptar ao instalar um mod de carro.
Como as texturas são adaptadas: Eu adicionei o parâmetro “stochastic” ao arquivo “texdb.txt” do SkyGfx (o mesmo arquivo usado na versão mobile etc).
Por exemplo, se você quer isto para a textura “Grass_128HV”, basta procurar pela linha dela e adicionar “stochastic=1” em algum local da linha. Simples.
Obviamente, no virá centenas de texturas configuradas para isto, você não precisa fazer nada, é só instalar.
Indo para o lado mais técnico, você encontra tudo no paper, mas abaixo há uma imagem que resume:
Ou seja, o shader pega aleatoriamente um pedaço da textura e mistura em 3 partes (triângulo). É relativamente complexo, mas não é algo de outro mundo.
No paper ele mostra testes de desempenho, tendo resultado de 4 a 5 vezes mais tempo para fazer o sampling de uma textura, no entanto, foi usado o shader que inclui a correção de histograma, que preserva a coloração da textura mas é muito mais complexo, eu decidi não incluir isto. Portanto eu chuto que é em torno de 3 vezes (visto que faz blend de 3 pontos).
Lembrando que isto é somente o tempo de fazer o “sampling” de uma textura, então é relativo à quantidade de pixels que aquela textura aparece na sua tela, e principalmente, o tempo de sampling de uma textura é algo extremamente minúsculo dentro do tempo de processamento de um jogo inteiro. É como uma gota de água numa piscina.
Exemplo: Se você trocar uma textura 256×256 por 512×512 ela demorará 4 vezes mais tempo para ser processada (afinal, o dobro de cada lado resulta no quádruplo), mas você nunca notará queda de FPS mesmo fazendo isto com dezenas de texturas. Experimente usar “NoTextures=1” no MixSets, o FPS do seu jogo vai continuar quase o mesmo, pois texturas são leves para serem processadas, principalmente no GTA SA que usa shaders extremamente simples. Normalmente o peso das texturas é de carregá-las (pois facilmente pesa vários MB), mas processá-las geralmente é muito rápido.
O jogo Beetles Underground faz blend de 4 texturas de terreno, 1024×1024 cada uma, onde cada uma delas a por stochastic (na qual aleatoriza e faz blend de 3 pontos), e o terreno ocupa quase a tela toda, e mesmo assim o jogo rodou excelente numa GT 730.
Portanto o desempenho continua ótimo, é esperado nenhuma mudança no FPS do seu jogo se você usa qualquer placa de vídeo offboard (dedicada), mas eu não sei dizer o mesmo de placas de vídeo onboard (ou offboard muito fraca e antiga), afinal, mesmo que seja leve, o impacto ainda existe.
Atualização: TJGM fez um bom vídeo sobre isso:
Eu pretendo finalizar a adaptação das texturas hoje e postar amanhã como “SkyGfx Extended”, que é meu fork do projeto SkyGfx (que é open source). Obviamente o autor, aap (The Hero), pode decidir incluir isto de maneira oficial, mas não é a proposta do SkyGfx. Por exemplo, isto requer editar um arquivo que no SkyGfx veio diretamente do mobile, e eu pretendo adicionar mais shaders ao jogo através do SkyGfx, por exemplo, tentar fazer algo com a água, e quem sabe no futuro seja adicionado e à normal maps etc. Ou seja, ao meu ver, seria interessante haver um fork do projeto para adicionar gráficos modernos ao jogo, e não só converter gráficos de outros consoles.
É possível fazer o mesmo no GTA Trilogy? Acredito que sim, mas eu não sei editar, ou se é possível editar, os shaders de um jogo compilado na Unreal.
Eu não sei o quanto vou levar isto à diante, pois eu já tenho muitos trabalhos para fazer, mas pelo menos esse shader stochastic é uma adição excelente que estou muito feliz com o resultado, e claro, é o que eu mais gosto: melhorar o jogo corrigindo os problemas sem perder a essência original.