Índice
- Introducción
- Aprender programación gráfica
- No obsesionarse con problemas menores
- ¿Por qué Vulkan?
- Aprender Vulkan
- Resumen del motor y análisis del frame
- Consejos generales
- Bibliotecas de Vulkan recomendadas
- Abstracción de
GfxDevice
- Manejo de shaders
- Push constants, descriptor sets y descriptores bindless
- Patrón de pipelines
- Uso de Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
- Descriptores bindless
- Manejo de datos dinámicos que deben subirse en cada frame
- Destructores, cola de eliminación y limpieza
- Sincronización
- Más notas de implementación
- Dibujar muchos sprites
- Compute skinning
- Separación entre juego / renderizador
- Carga de escenas y prefabs de entidades
- MSAA
- UI
- Dear ImGui y problemas con sRGB
- Otros puntos
- Lo que se ganó al cambiar a Vulkan
- Trabajo futuro
Introducción
- Este texto documenta la experiencia de aprender Vulkan y escribir un motor de juegos pequeño.
- Se trabajó durante 3 meses sin conocimientos previos de Vulkan.
- Se creó un juego 3D pequeño y las partes reutilizables se separaron como motor.
Aprender programación gráfica
- Para quienes empiezan por primera vez en programación gráfica, es mejor comenzar con OpenGL.
- Con OpenGL, es útil aprender a mostrar modelos con textura en pantalla y conceptos básicos de iluminación y shadow mapping.
- Recursos recomendados para aprender OpenGL:
- learnopengl.com
- El libro Anton’s OpenGL 4 Tutorials
- Las clases de Thorsten Thormählen (se recomiendan los primeros 6 videos)
No obsesionarse con problemas menores
- Hay que tener cuidado de no obsesionarse con problemas menores.
- Conviene preguntarse siempre: "¿De verdad hace falta?" y "¿Se convertirá en un cuello de botella?".
- Las funciones que no hacen falta pueden añadirse después.
- Es mejor empezar con un juego simple y evitar intentar construir un motor demasiado complejo.
¿Por qué Vulkan?
- Vulkan permite usar funciones modernas de GPU y es adecuado para quienes prefieren tecnologías y estándares open source.
- OpenGL es suficiente para juegos pequeños, pero es difícil aprovechar funciones modernas de GPU y su uso está limitado en macOS.
- WebGPU es más fácil de aprender que Vulkan y permite ejecutar juegos en el navegador.
Aprender Vulkan
- Aprender Vulkan parecía difícil al principio, pero se volvió más sencillo porque Khronos simplificó las partes complejas y ofrece bibliotecas útiles.
- Recursos recomendados para aprender Vulkan:
- vkguide
- La serie de clases de Vulkan de TU Wien
- El libro 3D Graphics Rendering Cookbook
- El libro Mastering Graphics Programming with Vulkan
Resumen del motor y análisis del frame
- El motor se llama EDBR (Elias Daler’s Bikeshed Engine) y comenzó como un proyecto para aprender Vulkan.
- El motor es adecuado sobre todo para juegos pequeños basados en niveles.
- Proceso de renderizado de un frame:
- Skinning: procesamiento del skinning de modelos usando compute shaders
- Shadow mapping: uso de una textura de profundidad de 4096x4096
- Geometría y shading: uso de un modelo PBR
- Resolución de profundidad: procesamiento manual mediante fragment shader
- Efectos de postprocesado: aplicación de depth fog, tone mapping y bloom
- UI: dibujo de la UI con una sola draw call
Consejos generales
Bibliotecas de Vulkan recomendadas
- vk-bootstrap: simplifica el código de inicialización de Vulkan
- Vulkan Memory Allocator (VMA): administra la asignación de memoria
- volk: simplifica la carga de funciones de extensión
Abstracción de GfxDevice
- La clase
GfxDevice encapsula la funcionalidad de Vulkan y maneja la inicialización del contexto de Vulkan, así como la creación y administración del swapchain.
Manejo de shaders
- Se usan shaders escritos en GLSL.
- Los shaders se precompilan en la etapa de build para reducir dependencias en tiempo de ejecución.
Push constants, descriptor sets y descriptores bindless
- En Vulkan, se usan descriptor sets para pasar datos a los shaders.
- Se minimiza el uso de descriptor sets mediante descriptores bindless y Buffer Device Address.
Patrón de pipelines
- Se usan clases de pipeline para separar las etapas de dibujo.
- Los métodos
init, cleanup y draw manejan la inicialización, limpieza y dibujo del pipeline.
Uso de Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
- Se unifica el tipo de vértice en uno solo, y el shader accede directamente a los vértices.
- La dirección del buffer se pasa usando push constants.
Descriptores bindless
- Las texturas se administran de forma bindless para permitir acceso directo desde los shaders.
- El ID de textura se pasa mediante push constants para hacer el sampling.
Opinión de GN⁺
- Vulkan ofrece alto rendimiento y funciones modernas de GPU, pero su curva de aprendizaje inicial es empinada.
- Es recomendable aprender primero OpenGL y luego pasar a Vulkan.
- Existen diversos recursos para aprender Vulkan, y aprovecharlos facilita el aprendizaje.
- Escribir un motor de juegos pequeño con Vulkan ayuda a comprender a fondo la programación gráfica.
- Conviene usar bibliotecas útiles para reducir la complejidad de Vulkan.
1 comentarios
Opiniones de Hacker News
Resumen de comentarios de Hacker News
Efecto del enfoque minimalista: Está escribiendo un cliente de metaverso en Rust y está enfrentando problemas complejos usando Vulkan, WGPU y Rend3. WGPU dificulta el desarrollo porque intenta dar soporte a muchas plataformas.
Ventajas de Vulkan y simplicidad de OpenGL: Vulkan permite aprovechar al máximo las funciones avanzadas de la GPU, pero OpenGL es adecuado para juegos simples en 2D o de pocos polígonos. La industria de juegos AAA se enfoca en la calidad gráfica, pero a muchos jugadores les importa más la jugabilidad.
Implementar solo lo necesario: Los programadores junior tienden a obsesionarse con las herramientas más nuevas y las "mejores prácticas", pero es importante enfocarse en la funcionalidad mínima necesaria para resolver el problema real.
La complejidad de Vulkan: En comparación con OpenGL, Vulkan es más difícil de optimizar en rendimiento y requiere mucho código y trabajo de sincronización. Como hobby, OpenGL ES3 es más práctico.
Problemas de capas adicionales de abstracción: Los materiales para aprender Vulkan introducen capas extra de abstracción, lo que hace difícil encontrar ejemplos básicos de manejo de memoria.
La dificultad de aprender Vulkan: OpenGL era fácil de aprender, pero Vulkan vuelve complejas incluso las tareas simples. Aprender una tecnología nueva toma mucho tiempo.
Aprender Vulkan para visualización de datos científicos: Aprendió Vulkan para escribir un motor de visualización de datos científicos, y durante el proceso de aprendizaje le tomó bastante tiempo entender muchas abstracciones.
Dificultades del aprendizaje de Vulkan: Es difícil entender cómo usar Vulkan dentro de un motor real. Se necesitan más materiales para aprender buenas abstracciones y cómo decidir el orden de renderizado.
Apoyo de la comunidad de programación gráfica: Durante el desarrollo de un motor con Vulkan, el apoyo y la retroalimentación de la comunidad fueron de gran ayuda.