Es el API para creación de aplicaciones nativas de bg2 engine. Se implementó originalmente para desarrollar el editor de escenas y assets y para dar soporte a plataformas móviles (iOS y Android). La primera versión del editor de escenas y assets se desarrolló utilizando esta API, pero aunque las versiones para iOS y Android se llegaron a desarrollar, no se utilizaron en ningún proyecto.
Para la segunda versión del editor opté por realizar el desarrollo con JavaScript, y debido a esto abandoné el desarrollo de esta API.
No obstante, recientemente retomé este proyecto debido a nuevas necesidades que hacían necesaria una actualización del API de C++. En esta sección voy a hablar de esta nueva API y su estado actual.
Descripción
Se trata de una biblioteca C++ que utiliza el API de Vulkan 1.2 y algunas extensiones de la versión 1.3. El objetivo de este proyecto es proporcionar un medio para generación de imágenes en tiempo real foto realistas, utilizando el hardware específico para renderización por trazado de rayos en tiempo real.
La biblioteca consta de dos módulos principales, que a su vez están divididos en otros sub módulos:
- Lectura y escritura de assets y escenas, herramientas de procesamiento de datos offscreen y otras utilidades que no hacen uso del API de renderización. En este módulo se han extraído todas aquellas funciones que pueden ejecutarse sin necesidad de disponer de hardware gráfico. Separando estos módulos es posible crear herramientas de manipulación de archivos de escenas, assets y bibliotecas.
- Renderización en tiempo real. Este módulo es el que hace uso del API de Vulkan para la renderización de escenas. En principio el módulo está siendo diseñado para que pueda funcionar en una ventana o bien fuera de pantalla. Esto hace que sea posible la creación de herramientas de generación de imágenes y vídeos a través de la línea de comandos.
A diferencia del API de JavaScript, en este caso he optado por implementar renderización diferida. Con esta técnica se hace una pasada de renderización en la que se recopilan las características de los objetos visibles en pantalla en varios mapas de bits: color, metalicidad, rugosidad, oclusión ambiental, mapas normales, profundidad y posición. En una segunda pasada se combinan estos mapas para generar una imagen final. Esta técnica tiene la ventaja de que los cálculos más costosos (iluminación, reflejos, sombreados, etc) no dependen de la complejidad de la escena, sino que solamente dependen de la cantidad de píxeles del área a renderizar.
Además, esta técnica permite incorporar información generada en paralelo, como por ejemplo los reflejos o la iluminación global que puede calcularse utilizando trazado de rayos en tiempo real.
En un principio, el API de C++ solamente va a estar disponible para dispositivos compatibles con Vulkan 1.2 o superior, y con una potencia gráfica razonablemente alta, ya que el API de JavaScript ya cubre de sobra el resto de casos de uso en los que no se dispone de un hardware tan potente.
Destacado
La parte más destacable de este proyecto para mi es el uso de las últimas técnicas de renderización por trazador de rayos en tiempo real utilizando Vulkan. No obstante, todavía no tengo mucho que contar de esta parte, ya que todo lo que he podido hacer hasta ahora a ese nivel se reduce a algunas pruebas.
Para implementar el API nativa he estado desarrollando un pequeño proyecto de motor gráfico para hacer pruebas de conceptos llamado vulkan-mini-engine. El nombre del proyecto es suficientemente descriptivo: lo único que tenía claro al empezar el desarrollo de la nueva API nativa era que iba a utilizar Vulkan como sistema de renderización.
En este proyecto realicé varias pruebas previas para un motor gráfico utilizando lenguaje Rust. Esto me sirvió para decidirme por C++, motivado por el echo de que Vulkan se publica en lenguaje C, y aunque existen varios wrappers no oficiales para Rust, no he encontrado ninguno que satisfaga completamente mis requisitos.
Recientemente, he ido recopilando las partes más interesantes de vulkan-mini-engine en un nuevo repositorio de Github público. Básicamente he reproducido el proceso de prototipado desde la primera opción usando Rust hasta la versión actual de C++, pero incluyendo solamente el código más relevante, y eliminando algunas pruebas que hice que no llevaron a ninguna parte.
La última versión del código para Rust, antes de continuar con el desarrollo en C++, está disponible en el mismo repositorio, en la rama Rust
. El código C++ con todas las pruebas de concepto que hice para implementar la parte de renderización de bg2 engine está en la rama principal
Disponibilidad
La versión anterior del API nativa está todavía disponible en su repositorio de Bitbucket, pero no la he mantenido ni actualizado desde 2018. Esta versión todavía no implementaba el modelo de iluminación PBR, aunque tiene algunas cosas interesantes, como los efectos de oclusión ambiental y los reflejos en espacio de pantalla.
https://bitbucket.org/ferserc1/bg2engine/src/master/
La versión actualizada del API todavía no está pública, por este motivo he recopilado todas las pruebas que he hecho en el proyecto vulkan-mini-engine, que está disponible a través de su repositorio de Github:
https://github.com/ferserc1/vulkan-mini-engine