De la wiki : "Khrono se refirió inicialmente a la API de Vulkan como la 'iniciativa de OpenGL de próxima generación', y que es " un esfuerzo de rediseño para unificar OpenGL y OpenGL ES en una API común que no será al revés compatible con las versiones existentes de OpenGL ".
Entonces, ¿deberían aquellos que están entrando en la programación de gráficos aprender mejor Vulkan en lugar de OpenGL? Parece que servirán para el mismo propósito.
Respuestas:
¡Apenas!
Esto se parece mucho a preguntar "¿Deberían los nuevos programadores aprender C ++ en vez de C" o "¿Deberían los nuevos artistas aprender pintura digital en lugar de pintura física?
Especialmente porque NO es compatible con versiones anteriores, los programadores de gráficos serían tontos si excluyeran la API de gráficos más común en la industria, simplemente porque hay una nueva. Además, OpenGL hace cosas diferentes de manera diferente. Es completamente posible que una compañía elija OpenGL en lugar de Vulkan, especialmente al principio del juego, y esa compañía no estaría interesada en alguien que no conozca OpenGL, independientemente de si conoce a Vulkan o no.
La especialización rara vez es una habilidad comercializable.
Para aquellos que no necesitan comercializar sus habilidades como tales, como los desarrolladores independientes, sería aún más tonto eliminar una herramienta de su caja de herramientas. Un desarrollador independiente depende aún más de la flexibilidad y de poder elegir lo que funciona, sobre lo que se financia. Especializarse en Vulkan solo limita sus opciones.
La especialización rara vez es un paradigma eficiente.
fuente
Si está comenzando ahora, y desea hacer un trabajo de GPU (en lugar de usar siempre un motor de juego como Unity), definitivamente debe comenzar aprendiendo Vulkan. Tal vez deberías aprender GL más tarde también, pero hay un par de razones para pensar primero en Vulkan.
GL y GLES se diseñaron hace muchos años, cuando las GPU funcionaban de manera bastante diferente. (La diferencia más obvia son las llamadas de sorteo en modo inmediato frente a la disposición en mosaico y las colas de comandos). GL lo alienta a pensar en un estilo de modo inmediato, y tiene mucho legado. Vulkan ofrece modelos de programación que están mucho más cerca de cómo funcionan las GPU contemporáneas, por lo que si aprende Vulkan, comprenderá mejor cómo funciona realmente la tecnología, y qué es eficiente y qué no. Veo a muchas personas que comenzaron con GL o GLES e inmediatamente adquieren malos hábitos, como emitir llamadas de extracción por objeto en lugar de usar VBO, o peor aún, usar listas de visualización. Es difícil para los programadores de GL descubrir lo que ya no se recomienda.
Es mucho más fácil pasar de Vulkan a GL o GLES que viceversa. Vulkan hace explícitas muchas cosas que estaban ocultas o eran impredecibles en GL, como el control de concurrencia, el uso compartido y el estado de representación. Impulsa una gran complejidad desde el controlador a la aplicación: pero al hacerlo, le da control a la aplicación y hace que sea más simple obtener un rendimiento predecible y compatibilidad entre diferentes proveedores de GPU. Si tiene algún código que funcione en Vulkan, es bastante fácil portarlo a GL o GLES, y termina con algo que usa buenos hábitos GL / GLES. Si tiene un código que funciona en GL o GLES, casi tiene que comenzar de nuevo para que funcione de manera eficiente en Vulkan: especialmente si fue escrito en un estilo heredado (ver punto 1).
Al principio, me preocupaba que Vulkan fuera mucho más difícil de programar y que, aunque estaría bien para los desarrolladores experimentados en compañías más grandes, sería una gran barrera para los indies y los aficionados. Le hice esta pregunta a algunos miembros del Grupo de trabajo, y me dijeron que tenían algunos puntos de datos de personas con las que habían hablado y que ya se habían mudado a Vulkan. Estas personas van desde desarrolladores en Epic que trabajan en la integración UE4 hasta desarrolladores de juegos para aficionados. Su experiencia fue que comenzar (es decir, tener un triángulo en la pantalla) implicaba aprender más conceptos y tener un código repetitivo más largo, pero no era demasiado complejo, incluso para los indies. Pero después de llegar a esa etapa, les resultó mucho más fácil construir una aplicación real y enviable, porque (a) el comportamiento es mucho más predecible entre las implementaciones de diferentes proveedores, y (b) llegar a algo que funcionó bien con todos los efectos activados no implicó tanta prueba y error. Con estas experiencias de desarrolladores reales, me convencieron de que la programación contra Vulkan es viable incluso para un principiante en gráficos, y que la complejidad general es menor una vez que pasa el tutorial y comienza a construir demostraciones o aplicaciones que puede ofrecer a otras personas.
Como otros han dicho: GL está disponible en muchas plataformas, WebGL es un buen mecanismo de entrega, hay una gran cantidad de software existente que usa GL, y hay muchos empleadores que contratan para esa habilidad. Va a estar presente durante los próximos años mientras Vulkan aumenta y desarrolla un ecosistema. Por estas razones, sería una tontería descartar aprender GL por completo. Aun así, será mucho más fácil y se convertirá en un mejor programador de GL (y un mejor programador de GPU en general), si comienza con algo que lo ayude a comprender la GPU, en lugar de comprender cómo funcionaban hace 20 años.
Por supuesto, hay una opción más. No sé si esto es relevante para usted en particular, pero creo que debería decirlo a los demás visitantes de todos modos.
Para ser un desarrollador de juegos independiente, o un diseñador de juegos, o para hacer experiencias de realidad virtual, no necesitas aprender Vulkan o GL. Muchas personas comienzan con un motor de juegos (Unity o UE4 son populares en este momento). El uso de un motor como ese le permitirá concentrarse en la experiencia que desea crear, en lugar de la tecnología que lo respalda. Le ocultará las diferencias entre GL y Vulkan, y no necesita preocuparse por cuál es compatible con su plataforma. Te permitirá aprender sobre coordenadas 3D, transformaciones, iluminación y animación sin tener que lidiar con todos los detalles arenosos a la vez. Algunos estudios de juegos o realidad virtual solo funcionan en un motor, y no tienen un experto en GL a tiempo completo. Incluso en los estudios más grandes que escriben sus propios motores, las personas que realizan la programación de gráficos son una minoría,
Aprender sobre los detalles de cómo interactuar con una GPU es sin duda una habilidad útil, que muchos empleadores valorarán, pero no debería sentir que tiene que aprender eso para ingresar a la programación 3D; e incluso si lo sabes, no será necesariamente algo que uses todos los días.
fuente
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.
fuente
El principal atractivo de OpenGL (al menos para mí) es que funciona en muchas plataformas. Actualmente, Vulkan no funciona en OSX, y Apple tiene una API competitiva llamada Metal. Es muy posible que pase algún tiempo antes de que Apple admita Vulkan, y cuando lo hagan, el soporte de Vulkan solo puede llegar a su último hardware. OpenGL ya es compatible con la mayoría del hardware, y continuará haciéndolo.
fuente
Depende de lo que quieras hacer. Si desea aprender programación gráfica solo para usted, realmente no importa lo que elija.
Si está pensando en un trabajo profesional, le recomiendo Vulkan. Está más cerca del hardware y creo que el conocimiento sobre lo que hace el hardware es importante para los programadores gráficos.
Vulkan está más cerca del hardware porque OpenGL hace muchas cosas bajo el capó que en Vulkan haces manualmente, como ejecutar la cola de comandos. Además, la gestión de la memoria depende de la aplicación, no del controlador. Debe preocuparse por asignar memoria
uniforms
(variable que pasa de la CPU a la GPU), por rastrearlos. Tiene más cosas de qué preocuparse, pero también le da más libertad en el uso de la memoria. Puede sonar aterrador y abrumador, pero realmente no lo es. Es solo la próxima API que necesita aprender.Comprender estas cosas también ayudará a comprender cómo funciona la GPU. Lo que le permitirá hacer algunas optimizaciones tanto en Vulkan como en OpenGL.
Y una cosa más que me viene a la mente, si está comenzando a aprender programación gráfica, probablemente cuando busca un trabajo, ya que un Vulkan será más popular (tal vez más popular que OpenGL). Además, hasta donde yo sé, la mayoría de las empresas que están utilizando algunas API de gráficos escriben sus propias funciones, por lo que existe la posibilidad de que en el trabajo no escriba en OpenGL ni en Vulkan, pero el conocimiento sobre GPU siempre será útil.
fuente
He estado "entrando" en la programación de gráficos por algunos meses.
En este momento todavía estoy en la escuela secundaria, y puedo decirte que casi siempre busco desarrollar aplicaciones multiplataforma. De hecho, este es mi problema número uno con Vulkan: no está desarrollado para funcionar en todas las plataformas. Trabajo con OpenGL en Java y tengo más de 6 meses.
Otro problema que tengo es con las afirmaciones de Vulkan es cómo dice ser mejor. Si bien OpenGL ciertamente no actualiza su sitio web con mucha frecuencia. Continúan lanzando actualizaciones constantemente y siempre espero nuevas actualizaciones que se ejecuten más rápido o funcionen mejor con nuevo hardware.
Dicho esto, aunque trabajo principalmente con OpenGL, entiendo los principios básicos de DirectX y Vulkan. Si bien no trabajo mucho con ellos, especialmente con Vulkan, ya que es muy difícil de aprender y no está tan bien estructurado para la programación como OpenGl y DirectX.
Por último, me gustaría agregar que la especialización en un solo campo, como la mayoría de las veces uso Java y OpenGL, no es increíblemente comercializable. Si quisiera conseguir un trabajo en una empresa que fabricara juegos, en su mayor parte OpenGL solo se usaría para crear juegos para el desarrollo de Linux y Android y posiblemente para OSX. DirectX para Windows y Consolas <Que Vulkan puede reemplazar en algunos casos.
No puedo esperar para las actualizaciones de OpenGL para siempre, y no lo haré. Pero es mi preferencia por el desarrollo.
fuente
Me gustaría darles mi perspectiva gráfica para principiantes sobre el tema. Lo que me di cuenta (en muchos años trabajando como ingeniero en otro campo) es que los conceptos fundamentales son la parte más importante. Una vez que tenga una comprensión sólida de ellos, aprender la última API nueva y brillante es la parte menos difícil. No sé si eres un joven aficionado que intenta programar el nuevo Skyrim o si estás buscando un trabajo en el campo de CG.
Te digo lo que creo que es el mejor enfoque en mi opinión para aprender gráficos por computadora "como un profesional".
Comenzar a preocuparse por el rendimiento antes de comprender cómo trazar una línea es como preocuparse por la aerodinámica de su automóvil antes de obtener la licencia de conducir.
fuente
Soy autodidacta en C ++ sin ninguna educación formal y en los últimos 15 años he aprendido tanto OpenGL 1.0 a través de Modern OpenGL y DirectX 9c, 10 y 11. No he entrado en DirectX 12 y he estado deseando prueba mi mano en Vulkan. Solo he completado algunos tutoriales básicos para dibujar un triángulo simple o un cubo giratorio simple con Vulkan. Al igual que con DirectX 11 y OpenGL 3.3+, he escrito motores de juegos 3D completamente funcionales e incluso los he usado para construir juegos simples.
Debo decir que depende del entorno general de la persona que está aprendiendo. Si recién se está iniciando en la programación de gráficos 3D, diría que los principiantes saltan a OpenGL o DirectX 11 ya que hay muchos tutoriales, recursos, ejemplos y aplicaciones que ya funcionan. Aprender gráficos en 3D no es un tema fácil.
Si nos abstraemos del aspecto de programación y nos enfocamos en la noción de qué tipo de técnicas se utilizan que involucran los diferentes niveles de matemática que conducen a conjuntos de datos y estructuras de datos y algoritmos; Hay muchas cosas que debes saber y comprender antes de intentar construir un motor de juego 3D o utilizar uno existente de manera efectiva.
Ahora, si ya comprende todas las matemáticas y la teoría detrás de esto y tiene experiencia en programación, puede usar API, bibliotecas y aplicaciones ya existentes, como Unity o Unreal Engine, y simplemente escribir el código fuente y los scripts que necesita para que su aplicación funcione .
Entonces, desde mi propio entendimiento y según la forma en que lo veo, es esto si estás buscando construir un juego rápido solo por el hecho de construir un juego; vaya con marcos ya existentes que harían que su tiempo de producción sea mucho menor. Por otro lado, si desea comprender el funcionamiento interno de cómo se diseñan los Motores de juego / Motores de física / Motores y simuladores de animación y desea construir uno usted mismo, aquí es donde puede elegir entre elegir su API como DirectX, OpenGL o Vulkan. Uno de los factores determinantes aquí también sería su conocimiento de programación existente. Lo que quiero decir con esto es si no sabes nada sobre llamadas múltiples, síncronas vs asíncronas, cercas de memoria, carreras de datos, semáforos y paralelismo (programación paralela),
Menciono esto porque si no sabe cómo administrar adecuadamente su memoria junto con sus hilos y tiempo de acceso; ¡Vulkan te morderá en el culo! Donde OpenGL y DirectX mantendrán tu mano hasta el final consumiendo mucha más potencia de CPU.
Ahora, si su nivel de conocimiento de programación es decente, y tiene los siguientes antecedentes matemáticos que incluyen todos los niveles de álgebra, geometría, trigonometría, álgebra booleana, probabilidad, estadística, álgebra basada en matriz de vectores, cálculo I, II, ... Infinito (lol). Cálculo vectorial, álgebra lineal, sistemas de ecuaciones lineales, geometría analítica con cálculo vectorial de cálculos multivariables, teoría de números y conjuntos, conjuntos y estructuras de datos, análisis computacional, diseño computacional y algorítmico. Luego, puede entrar en los conceptos de lo que se necesita para hacer un motor de juego real y esto es sin ninguna matemática aplicada o ecuaciones de física que necesitará. Una vez que tenga esos antecedentes y suficiente experiencia en programación, especialmente la gestión de memoria y la aritmética de puntero, puede comenzar a construir su Game Engine.
Entonces, la cuestión aquí es que debes comprender todos los aspectos de lo que se necesita para hacer un Game Engine para hacer una programación de gráficos avanzada. Si solo está haciendo gráficos en 2D, ¡la vida no es demasiado difícil, ya que puede hacerlo en Python sin ninguna de las API mencionadas anteriormente! Pero si quieres ser serio y diseñar un motor de juego de potencia completo que sea robusto con muchos conjuntos de características, entonces la elección aquí sería C o C ++ y usar OpenGL, Direct X o Vulkan. Cualquiera de ellos estaría bien. Ahora, si está construyendo el motor desde cero y está buscando el motor en funcionamiento más "eficiente" con la menor cantidad de recursos de carga, entonces debería elegir Vulkan. Pero si sigues esta ruta, ¡al menos deberías saber todo lo que he mencionado anteriormente y algo más!
Como puede ver, Vulkan no está realmente orientado a programadores principiantes en este campo. Debe tener un amplio conocimiento de todas las matemáticas, paradigmas de programación, todos los diferentes tipos de conjuntos de datos y algoritmos, incluidos subprocesos, sincronización de memoria y programación paralela. E incluso entonces eso es solo para que la aplicación cargue un simple triángulo 2D en la pantalla. ¡Lo que se puede hacer en aproximadamente 100 líneas de código en OpenGL o 250 líneas de código en DirectX toma casi 1,000 líneas de código en Vulkan!
Vulkan le deja todo a usted, ya que usted es responsable de todos los aspectos de cómo está utilizando Vulkan en su aplicación. No se puede agarrar de la mano, no se interpone en su camino, ¡le permitirá dispararse en el pie o colgarse para comprar una soga recursiva!
Ahora, esto no quiere decir que los principiantes o los que son nuevos en este campo no deberían aprender Vulkan, pero lo que sugeriría para ellos es esto: Primero aprenda lo suficiente de OpenGL y / o DirectX para mojarse los pies y ver cómo La aplicación básica está estructurada solo para representar un triángulo simple o un cubo giratorio. Familiarícese con sus API y sus patrones recurrentes de sus estructuras. Mientras aprende que puede aprender Vulkan en paralelo en paralelo, de esta manera puede ver cómo cada uno de los tres está logrando la misma tarea, pero sabe cómo lo hacen de manera diferente, también puede comparar los resultados entre las diferentes API y allí puede elegir cuál es el preferido para usted. Este método también le daría otra herramienta en su caja de herramientas, e incluso podría escribir su aplicación para admitir los 3 y tener el "
Al final, depende de esa persona elegir la ruta que desea seguir, y a partir de ahí su éxito estará determinado por su dedicación, estudio constante, trabajo duro, prueba y error, y lo más importante, sus fracasos. Si no fallas, ¡entonces no tienes éxito! ¡Solo tiene éxito si ha fallado, ha encontrado su (s) error (es), lo ha corregido, ha seguido adelante y ha vuelto a subir y lo ha vuelto a hacer!
fuente
Primero debe aprender OpenGL, ya que ese es el estándar para Gráficos, en muchas plataformas.
Incluso si hay una biblioteca más nueva, es muy importante comprender los conceptos básicos y trabajar con un lenguaje que se usa en toda la industria ... Especialmente porque Vulkan no se usará en Grandes Empresas por un tiempo, desde entonces.
Nadie quiere adaptarse de inmediato y terminar jodiéndose con un Marco / Biblioteca no estable.
Tendrían que contratar / volver a capacitar a sus programadores actuales de Open-GL, y no hay necesidad de hacerlo.
Además, he oído que OpenGL y Vulkan no son exactamente lo mismo. Escuché que Vulkan es una API de nivel inferior y más cercana al código de máquina que OpenGL.
Esta respuesta que acabo de encontrar parece tener mucha información excelente
https://gamedev.stackexchange.com/questions/96014/what-is-vulkan-and-how-does-it-differ-from-opengl
Otra cosa que es algo a considerar es el problema que sucedió con OpenGL 1.
OpenGL 1 a OpenGL 2 tuvo cambios MAYORES, y dado que muchas personas usaban OpenGL1 y el hardware lo admitía, es necesario implementar una gran compatibilidad con versiones anteriores en algunas aplicaciones / motores, y eso a veces es realmente doloroso para los desarrolladores seguir apoyándolo. .
Además del soporte, el idioma cambió tanto que tuvo que aprender cosas nuevas.
Esto ha sucedido con marcos como JavaFX (de 1.x a 2.x) y Play! Marco (también 1.xa 2.x). Completa los cambios en el marco, lo que significa que tenemos que volver a aprender ... todo ...
Así que esencialmente lo que debes hacer es esperar hasta que Vulkan sea ESTABLE. Eso significa esperar hasta Probablemente el parche 2.0. No significa que no pueda aprender sobre los conceptos básicos de Vulkan, pero sepa que esto podría cambiar. Supongo que un grupo como Kronos proporcionaría una API muy estable desde el principio, especialmente porque hay varios ingenieros de Nvidia y AMD trabajando en Vulkan, incluida una persona de Nvidia que supervisa el proyecto aparentemente, así como The base of Mantle; sin embargo, como cualquier software, los codificadores veremos qué tan bien funciona desde el principio, pero muchos desconfían y esperan ver qué sucede.
fuente