El aprendizaje de la programación de gráficos es más que solo aprender API. Se trata de aprender cómo funcionan los gráficos. Transformaciones de vértices, modelos de iluminación, técnicas de sombra, mapeo de texturas, renderizado diferido, etc. Estos no tienen absolutamente nada que ver con la API que utiliza para implementarlos.
Entonces la pregunta es esta: ¿quieres aprender a usar una API? ¿O quieres aprender gráficos ?
Para hacer cosas con gráficos acelerados por hardware, debe aprender a usar una API para acceder a ese hardware. Pero una vez que tiene la capacidad de interactuar con el sistema, su aprendizaje de gráficos deja de centrarse en lo que la API hace por usted y, en cambio, se centra en los conceptos gráficos. Iluminación, sombras, protuberancia, etc.
Si su objetivo es aprender conceptos gráficos, el tiempo que pasa con la API es el tiempo que no pasa aprendiendo conceptos gráficos . Cómo compilar sombreadores no tiene nada que ver con los gráficos. Tampoco cómo enviarles uniformes, cómo cargar datos de vértices en buffers, etc. Estas son herramientas y herramientas importantes para realizar trabajos gráficos.
Pero en realidad no son conceptos gráficos. Son un medio para un fin.
Se necesita mucho trabajo y aprendizaje con Vulkan antes de que pueda llegar al punto en el que esté listo para comenzar a aprender conceptos gráficos. Pasar datos a los sombreadores requiere una gestión explícita de la memoria y una sincronización explícita del acceso. Etcétera.
Por el contrario, llegar a ese punto con OpenGL requiere menos trabajo. Y sí, estoy hablando de OpenGL de perfil central moderno y basado en sombreador.
Simplemente compare lo que se necesita para hacer algo tan simple como limpiar la pantalla. En Vulkan, esto requiere al menos cierta comprensión de una gran cantidad de conceptos: buffers de comandos, colas de dispositivos, objetos de memoria, imágenes y las diversas construcciones de WSI.
En OpenGL ... es tres funciones: glClearColor
, glClear
y el intercambio de llamadas memorias intermedias específico de la plataforma. Si está utilizando OpenGL más moderno, puede reducirlo a dos: glClearBufferuiv
e intercambiar buffers. No necesita saber qué es un framebuffer o de dónde proviene su imagen. Lo borras e intercambias buffers.
Debido a que OpenGL te oculta mucho, lleva mucho menos esfuerzo llegar al punto en el que realmente estás aprendiendo gráficos en lugar de aprender la interfaz del hardware de gráficos.
Además, OpenGL es una API (relativamente) segura. Emitirá errores cuando haga algo mal, por lo general. Vulkan no lo es. Si bien hay capas de depuración que puede usar para ayudar, la API principal de Vulkan no le dirá casi nada a menos que haya una falla de hardware. Si hace algo mal, puede obtener procesamiento de basura o bloquear la GPU.
Junto con la complejidad de Vulkan, se hace muy fácil hacer accidentalmente lo incorrecto. Olvidar establecer una textura en el diseño correcto puede funcionar en una implementación, pero no en otra. Olvidar un punto de sincronización puede funcionar a veces, pero luego falla repentinamente sin razón aparente. Etcétera.
Dicho todo esto, hay más en aprender gráficos que aprender técnicas gráficas. Hay un área en particular donde Vulkan gana.
Rendimiento gráfico .
Ser un programador de gráficos 3D generalmente requiere una idea de cómo optimizar su código. Y es aquí donde la ocultación de información de OpenGL y hacer cosas a sus espaldas se convierte en un problema.
El modelo de memoria OpenGL es sincrónico. La implementación puede emitir comandos de forma asincrónica siempre que el usuario no pueda notar la diferencia. Entonces, si renderiza a alguna imagen, luego intente leerla, la implementación debe emitir un evento de sincronización explícito entre estas dos tareas.
Pero para lograr el rendimiento en OpenGL, debe saber que las implementaciones hacen esto, para que pueda evitarlo . Debe darse cuenta de dónde la implementación emite eventos de sincronización en secreto y luego reescribir su código para evitarlos tanto como sea posible. Pero la API en sí misma no lo hace obvio; tienes que haber obtenido este conocimiento de alguna parte.
Con Vulkan ... usted es quien debe emitir esos eventos de sincronización. Por lo tanto, debe tener en cuenta el hecho de que el hardware no ejecuta comandos sincrónicamente. Debe saber cuándo necesita emitir esos eventos y, por lo tanto, debe tener en cuenta que probablemente retrasarán su programa. Entonces haces todo lo posible para evitarlos.
Una API explícita como Vulkan te obliga a tomar este tipo de decisiones de rendimiento. Y, por lo tanto, si aprende la API de Vulkan, ya tiene una buena idea sobre qué cosas van a ser lentas y qué cosas serán rápidas.
Si tiene que hacer un trabajo de framebuffer que lo obligue a crear un nuevo renderpass ... es muy probable que sea más lento que si pudiera encajarlo en un subpass separado de un renderpass. Eso no significa que no pueda hacer eso, pero la API le dice por adelantado que podría causar un problema de rendimiento.
En OpenGL, la API básicamente te invita a cambiar tus archivos adjuntos de framebuffer willy-nilly. No hay orientación sobre qué cambios serán rápidos o lentos.
Entonces, en ese caso, aprender Vulkan puede ayudarlo a aprender mejor sobre cómo hacer gráficos más rápido. Y ciertamente lo ayudará a reducir la sobrecarga de la CPU.
Todavía llevará mucho más tiempo antes de que pueda llegar al punto en el que pueda aprender técnicas de representación gráfica.