Versión HD de Halo 2: un proyecto de remasterización que desafía los límites del Xbox original
(icode4.coffee)Halo 2 HD llevando al límite al Xbox original
Esta publicación del blog cubre todo el trabajo realizado para agregar compatibilidad con resolución HD a la versión de Halo 2 para el Xbox original. Desde parches del juego hasta modificaciones de hardware en la consola Xbox y la creación de herramientas personalizadas para hacer benchmarks de rendimiento, el objetivo de este proyecto fue superar los límites de ambos y ver hasta dónde se podía llegar.
- El amigo "doom" ha estado haciendo ingeniería inversa e investigando el hardware y el software del Xbox original durante los últimos años
- Usando su placa interposer de CPU personalizada, fue posible reemplazar el CPU Pentium 3 original por una variante de Pentium 3 de 1.4Ghz y hacerle overclock hasta ~2Ghz
- También escribió parches personalizados para el kernel de Xbox con el fin de parchear en tiempo real los cálculos de timing del juego para el CPU más rápido
- Combinado con otras mejoras de hardware como RAM y SSD, comenzaron a llamarlo la "god box"
- doom quería que alguien hiciera parches adecuados de resolución HD para 720p en juegos populares, y me lo pidió a mí
- Acepté la propuesta con la condición de hacer overclock a la GPU, y él lo hizo y entregó la consola "GENESIS-3"
Renderizar en HD
- Hay que cambiar el tamaño de los buffers front/back de D3D
- Hay que modificar las funciones _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds y rasterizer_device_initialize
- Cuando 720p está activado, hay que establecer g_progressive_scan_enabled y configurar las variables screen_bounds y frame_bounds según el modo de video
- También hay que establecer banderas adicionales en los parámetros de presentación de D3D dependiendo de si el modo de video es progresivo o entrelazado
Usar la memoria de D3D de forma eficiente
- Xbox usa una arquitectura de memoria unificada en la que el CPU y la GPU comparten la misma RAM
- Halo 2 crea los render targets manualmente en lugar de usar las funciones que proporciona D3D
- Halo 2 usa alrededor de 25 render targets distintos, pero asigna solo 4-5 buffers únicos para ahorrar memoria
- La función rasterizer_primary_targets_initialize usa dimensiones hardcodeadas de 640x480 para crear render targets adicionales y texture views
- Por eso, después de redimensionar los buffers back/front/depth, hay que hookear esta función y corregir las dimensiones
Redimensionar los targets del rasterizer
- El render target del acumulador de texturas (texaccum) debe coincidir con la resolución del back buffer
- La función rasterizer_targets_initialize tiene hardcodeadas las dimensiones del acumulador de texturas
- Se hookea la función _rasterizer_alloc_and_create_render_target para cambiar las dimensiones y hacer que coincidan con el tamaño del back buffer
Opinión de GN⁺
- Este proyecto fue un desafío técnico muy difícil, pero fue posible gracias al profundo entendimiento de Ryan sobre el motor de Halo 2 y a la experiencia de doom con el hardware de Xbox
- Hot-patchear el kernel de Xbox para los parches de HD y overclock fue una solución realmente impresionante y creativa. Es una gran forma de superar las limitaciones físicas del hardware
- El resultado final es excelente, aunque todavía hay margen de mejora, especialmente en la reducción del texture pop-in y en la mejora de los tiempos de carga
- Confirmar que el rendering está limitado por la GPU fue una observación importante. Con RAM adicional se podría usar un caché de texturas más grande para aliviar el cuello de botella
- Hay formas de optimizar aún más el motor de renderizado, como ajustar el ángulo de FOV de la cámara, optimizar el sistema LOD y usar compresión de modelos/texturas más eficiente
- Hacer este nivel de trabajo de ingeniería inversa para un juego de consola antiguo es sumamente impresionante. Es un gran logro para la escena del retro gaming
Aún no hay comentarios.