L'apprendimento della programmazione grafica è molto più che l'apprendimento delle API. Si tratta di imparare come funziona la grafica. Trasformazioni di vertici, modelli di illuminazione, tecniche d'ombra, mappatura delle trame, rendering differito e così via. Questi non hanno assolutamente nulla a che fare con l'API che usi per implementarli.
Quindi la domanda è questa: vuoi imparare come usare un'API? O vuoi imparare la grafica ?
Per fare cose con grafica con accelerazione hardware, devi imparare come usare un'API per accedere a quell'hardware. Ma una volta che hai la possibilità di interfacciarti con il sistema, l'apprendimento della grafica smette di concentrarsi su ciò che l'API fa per te e si concentra invece su concetti grafici. Illuminazione, ombre, bump-mapping, ecc.
Se il tuo obiettivo è apprendere concetti grafici, il tempo che passi con l'API è il tempo che non stai impiegando per apprendere concetti grafici . Come compilare shader non ha nulla a che fare con la grafica. Né come inviare loro uniformi, come caricare i dati dei vertici nei buffer, ecc. Questi sono strumenti e strumenti importanti per fare grafica.
Ma in realtà non sono concetti grafici. Sono un mezzo per raggiungere un fine.
Ci vuole molto lavoro e apprendimento con Vulkan prima che tu possa arrivare al punto in cui sei pronto per iniziare ad apprendere concetti grafici. Il passaggio dei dati agli shader richiede una gestione esplicita della memoria e una sincronizzazione esplicita dell'accesso. E così via.
Al contrario, arrivare a quel punto con OpenGL richiede meno lavoro. E sì, sto parlando di OpenGL moderno, basato sul core-shader.
Basta confrontare ciò che serve per fare qualcosa di semplice come cancellare lo schermo. In Vulkan, questo richiede almeno una certa comprensione di un gran numero di concetti: buffer di comando, code dei dispositivi, oggetti di memoria, immagini e vari costrutti WSI.
In OpenGL ... è tre funzioni: glClearColor
, glClear
, e il buffer di swap chiamata specifico per la piattaforma. Se stai usando OpenGL più moderno, puoi ridurlo a due: glClearBufferuiv
e scambiare i buffer. Non è necessario sapere cos'è un framebuffer o da dove provenga la sua immagine. Lo si cancella e si scambiano i buffer.
Poiché OpenGL nasconde molto da te, ci vuole molto meno sforzo per arrivare al punto in cui stai effettivamente imparando la grafica piuttosto che imparare l'interfaccia con l'hardware grafico.
Inoltre, OpenGL è un'API (relativamente) sicura. Genererà errori quando si fa qualcosa di sbagliato, di solito. Vulkan no. Mentre ci sono livelli di debug che puoi usare per aiutare, l'API principale Vulkan non ti dirà quasi nulla a meno che non ci sia un errore hardware. Se si fa qualcosa di sbagliato, è possibile ottenere il rendering di immondizia o crash della GPU.
Insieme alla complessità di Vulkan, diventa molto facile fare accidentalmente la cosa sbagliata. Dimenticare di impostare una trama nel giusto layout può funzionare in un'implementazione, ma non in un'altra. Dimenticare un punto di sincronismo può funzionare a volte, ma poi improvvisamente fallire per apparentemente senza motivo. E così via.
Detto questo, l'apprendimento della grafica è molto più che l'apprendimento delle tecniche grafiche. C'è un'area in particolare dove vince Vulkan.
Prestazioni grafiche .
Essere un programmatore di grafica 3D di solito richiede qualche idea su come ottimizzare il codice. Ed è qui che nascondere le informazioni di OpenGL e fare cose alle tue spalle diventa un problema.
Il modello di memoria OpenGL è sincrono. L'implementazione può emettere comandi in modo asincrono, a condizione che l'utente non sia in grado di distinguere. Quindi, se esegui il rendering su qualche immagine, quindi prova a leggere da essa, l'implementazione deve emettere un evento di sincronizzazione esplicita tra queste due attività.
Ma per ottenere prestazioni in OpenGL, devi sapere che le implementazioni lo fanno, in modo da poterlo evitare . Devi capire dove l'implementazione genera segretamente eventi di sincronizzazione e quindi riscrivere il codice per evitarli il più possibile. Ma l'API stessa non lo rende ovvio; devi aver acquisito questa conoscenza da qualche parte.
Con Vulkan ... sei tu quello che deve emettere quegli eventi di sincronizzazione. Pertanto, è necessario essere consapevoli del fatto che l'hardware non esegue i comandi in modo sincrono. Devi sapere quando devi emettere quegli eventi e quindi devi essere consapevole che probabilmente rallenteranno il tuo programma. Quindi fai tutto il possibile per evitarli.
Un'API esplicita come Vulkan ti obbliga a prendere questo tipo di decisioni sulle prestazioni. E quindi, se impari l'API Vulkan, hai già una buona idea di quali cose saranno lente e quali saranno veloci.
Se devi fare un po 'di lavoro con framebuffer che ti costringe a creare un nuovo renderpass ... le probabilità sono buone che questo sia più lento che se potessi inserirlo in un sottopasso separato di un renderpass. Ciò non significa che non puoi farlo, ma l'API ti informa in anticipo che potrebbe causare un problema di prestazioni.
In OpenGL, l'API in sostanza ti invita a modificare i tuoi allegati framebuffer, volenti o nolenti. Non ci sono indicazioni su quali cambiamenti saranno veloci o lenti.
Quindi, in tal caso, l'apprendimento di Vulkan può aiutarti a imparare meglio come rendere la grafica più veloce. E sicuramente ti aiuterà a ridurre il sovraccarico della CPU.
Ci vorrà ancora molto più tempo prima di arrivare al punto in cui è possibile apprendere le tecniche di rendering grafico.