Descripción general #
The Witcher: A Bard’s Tale es un beat-’em-up / hack-and-slash cooperativo. Los jugadores controlan a Geralt de Rivia y Yennefer de Vengerberg mientras luchan para rescatar a Ciri.
Sobre el proyecto #
Es un proyecto universitario en grupo construido con un motor personalizado en C++ y OpenGL. El diseño se centra en un combate responsivo, encuentros cinemáticos con jefes y una presentación pulida. Mi trabajo abarca programación de gráficos, herramientas de gameplay y creación de contenido.
Mis contribuciones individuales #
- Skinning en GPU (skinning en vertex shader)
- Sistema de subtítulos (importación JSON + efecto máquina de escribir)
- Presentación de jefes (movimiento cinemático de cámara)
- Enemigo dummy para pruebas de combate
- Efectos de shader de disolución
- Modelos de personajes principales y assets 3D
- Iluminación de escena
- Diseño de HUD y pulido de menús
Skinning con shaders #
Para mejorar el rendimiento en tiempo de ejecución, movimos el skinning a la GPU (vertex skinning en el vertex shader). Cada vértice almacena:
- un
ivec4de índices de huesos (máximo 4 huesos por vértice), y - un
vec4de pesos de huesos (un peso por índice de hueso).
En la CPU subimos un array de matrices de transformación de huesos (un mat4 por hueso). El vertex shader lee los índices y pesos de los huesos, construye una matriz de skinning a partir de las matrices de huesos correspondientes, y transforma la posición del vértice y la normal íntegramente en la GPU.
También corregí un error donde algunos modelos colapsaban hacia el origen. La causa raíz era aplicar las transformaciones de huesos relativas a las posiciones originales del vértice en lugar de usar el origen de la malla; la corrección consistió en calcular las posiciones con skinning relativas al origen de la malla y aplicar correctamente las transformaciones de huesos.
Sistema de subtítulos #
El juego incluye secuencias narrativas que requieren subtítulos. Utilizamos Subtitle Horse para crear los subtítulos y los exportamos a JSON para integrarlos fácilmente en nuestro motor.
Implementé un Gestor de Subtítulos que:
- Carga los tiempos y textos de los subtítulos desde archivos JSON
- Muestra líneas temporizadas con un efecto de máquina de escribir
- Sincroniza los subtítulos con los tiempos de las cinemáticas
Presentación del jefe (cámara cinemática) #
Para las introducciones de los jefes creé un sistema de cámara cinemática. La cámara sigue una curva de Bézier para centrarse en el jefe con un revelado dramático, y luego regresa suavemente al jugador antes de reanudar el gameplay.
Está implementado como un pequeño script que muestrea una cúbica de Bézier en tiempo normalizado e interpola tanto la posición como la orientación.
Enemigo dummy #
Implementé un enemigo dummy para el entrenamiento de combate. El dummy permite a los jugadores practicar ataques y combos, y ayuda al equipo a depurar la temporización de entradas, la detección de golpes y las transiciones de animación.
Shader de disolución #
Implementé un shader de disolución para transiciones de aparición/desaparición estilizadas. El efecto usa una textura de ruido (o ruido procedural) y un parámetro que controla una máscara de umbral, creando fundidos suaves y controlables con detalle en los bordes.



Modelos 3D y assets #
Produje personajes y assets del juego, y aprendí el pipeline de producción artística: escultura, retopología en Maya, pintura de texturas en Substance y creación de bases low-poly para producción.
Geralt de Rivia #
Yennefer de Vengerberg #
Enemigo Ghoul #
Otros assets #
Creé props de entorno como arbustos, rocas y minerales utilizados en diferentes escenas.





Diseño de HUD #
Creé el layout del HUD e iconos, iteré sobre prototipos de UI, e implementé iconos pulidos y elementos de feedback.



Pulido del menú principal #
Para el menú principal añadí sistemas de partículas y un post-proceso de bloom global para hacer la escena más dinámica y atmosférica.


Ajustes de iluminación #
Iteré sobre la iluminación de la escena para que coincidiera con la atmósfera de cada arena, equilibrando luces direccionales, contribución ambiental y elementos precalculados donde correspondía.






Enlaces y descargas #
- Demo / build: Jugar en GitHub Pages
- Código fuente: Repositorio de GitHub
- Web del juego: Sitio web del juego