Versão HD de Halo 2: um projeto de remasterização que desafia os limites do Xbox original
(icode4.coffee)Halo 2 em HD, rompendo os limites do Xbox original
Este post do blog cobre todo o trabalho realizado para adicionar suporte a resolução HD à versão original de Halo 2 no Xbox. De patches no jogo a modificações de hardware no console Xbox, passando pela criação de ferramentas personalizadas para benchmark de desempenho, o objetivo deste projeto foi superar os limites de ambos e ver até onde seria possível ir.
- O amigo "doom" passou os últimos anos fazendo engenharia reversa e estudando o hardware e o software do Xbox original
- Usando sua placa interposer de CPU personalizada, foi possível substituir a CPU Pentium 3 original por uma variante de Pentium 3 de 1.4Ghz e fazer overclock até ~2Ghz
- Ele também escreveu patches personalizados para o kernel do Xbox para corrigir em tempo real os cálculos de timing do jogo para a CPU mais rápida
- Combinado com outros upgrades de hardware, como RAM e SSD, isso passou a ser chamado de "god box"
- doom queria alguém que fizesse patches adequados de resolução HD para jogos populares em 720p, e me pediu isso
- Eu aceitei a proposta com a condição de fazer overclock na GPU, e ele realizou isso e forneceu o console "GENESIS-3"
Renderizando em HD
- É necessário alterar o tamanho dos buffers D3D de frente/verso
- É necessário modificar as funções _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds e rasterizer_device_initialize
- Quando 720p está ativado, é preciso definir
g_progressive_scan_enablede ajustar as variáveisscreen_boundseframe_boundsde acordo com o modo de vídeo - Também é necessário definir flags adicionais nos parâmetros de apresentação do D3D, dependendo de o modo de vídeo ser progressivo ou entrelaçado
Usando a memória D3D com eficiência
- O Xbox usa uma arquitetura de memória unificada em que CPU e GPU compartilham a mesma RAM
- Halo 2 cria os render targets manualmente, em vez de usar as funções fornecidas pelo D3D
- Halo 2 usa cerca de 25 render targets diferentes, mas aloca apenas 4-5 buffers únicos para economizar memória
- A função rasterizer_primary_targets_initialize cria render targets adicionais e visualizações de textura usando dimensões fixas de 640x480
- Por isso, após redimensionar os buffers traseiro/dianteiro/de profundidade, é necessário fazer hook nessa função e corrigir as dimensões
Redimensionando os alvos do rasterizer
- O render target do acumulador de textura (texaccum) precisa corresponder à resolução do back buffer
- A função rasterizer_targets_initialize fixa as dimensões do acumulador de textura no código
- Foi feito hook na função _rasterizer_alloc_and_create_render_target para alterar as dimensões e corresponder ao tamanho do back buffer
Opinião do GN⁺
- Este projeto foi um desafio técnico extremamente difícil, mas só foi possível graças ao profundo entendimento de Ryan sobre a engine de Halo 2 e à expertise de doom em hardware do Xbox
- Fazer hot patch no kernel do Xbox para os patches de HD e overclock foi uma solução realmente impressionante e criativa. É uma ótima forma de superar os limites físicos do hardware
- O resultado final é excelente, mas ainda há espaço para melhorias, especialmente na redução de texture pop-in e na melhoria dos tempos de carregamento
- Confirmar que o rendering era limitado pela GPU foi um insight importante. Com RAM adicional, seria possível usar um cache de texturas maior para aliviar o gargalo
- Há maneiras de otimizar ainda mais a engine de renderização, como ajustar o ângulo de FOV da câmera, otimizar o sistema de LOD e usar compressão mais eficiente de modelos/texturas
- Fazer um trabalho de engenharia reversa nesse nível para um jogo de console antigo é muito impressionante. Esta é uma grande conquista para a cena de jogos retrô
Ainda não há comentários.