3 puntos por GN⁺ 2024-06-07 | 1 comentarios | Compartir por WhatsApp

Í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

 
GN⁺ 2024-06-07
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.