Blog

motore di rendering

Sviluppare un motore grafico con C++ e OpenGL/DirectX – aggiornato 2020

Consigli / Guide

Sviluppare un motore grafico con C++ e OpenGL/DirectX – aggiornato 2020

Se stai leggendo questo articolo è perché sei talmente nerd da voler ignorare il buon senso e tutti vari motori grafici lì fuori e crearne uno tutto tuo. Non ti giudico.

Questo articolo è proprio quello che cercavi. Sto per darti delle informazioni di grande valore. Non troverai da nessuna parte un articolo come questo, nemmeno in inglese.

Le informazioni raccolte qui sono il frutto di tanta curiosità e voglia di avere una visione più ampia di quest’industria, senza soffermarsi sulle solite banalità ripetute dalle varie riviste di informatica e videogiochi.

Prima di proseguire però sento il dovere morale di dover fare delle considerazioni.

Sono consapevole che noi sviluppatori siamo sempre motivati dalle ragioni sbagliate, quindi ricorda: il successo del tuo software è dato dal suo marketing, il lato tecnico conta meno di zero. Puoi sviluppare il tuo gioco in Assembly, C++, C#, C o Python, all’utente finale non frega assolutamente nulla.

Se proprio devi investire ore della tua vita a realizzare uno dei tipi di software – in assoluto – più difficili da realizzare almeno cerca di ricavarne poi qualcosa, in termini di denaro. Questo libro ti interessa:

Il libro in questione è scritto proprio per gli sviluppatori come te. Si propone con l’obbiettivo di vendere gli sforzi del tuo lavoro, visto che essere dei decenti game designer non basta.

Ok, visto che sei arrivato a leggere fino a qui senza chiudere la pagina è arrivato il momento di cominciare.

Introduzione

Nel corso dell’articolo ti guiderò, passo per passo, in quelli che sono gli argomenti da studiare per realizzare un motore di gioco, fornendoti anche le risorse necessarie ad approfondire.

Ma cos’è esattamente un motore di gioco?

Un motore di gioco (“Game Engine” in inglese, anche se in italiano viene solitamente chiamato “Motore grafico”, anche dal sottoscritto) è un software composto da molte parti differenti tra loro, integrate assieme.

Oltre alla parte grafica è presente anche un motore fisico, un motore dell’audio, algoritmi di IA, Networking… e molto altro.

Tuttavia, è inutile che ce la raccontiamo, so già che la parte che ti interessa di più è quella grafica, ovvero il motore di rendering.

Sicuramente il motore di rendering rappresenta una delle parti più affascinanti di questo tipo di software e per tua fortuna sono disponibili online tantissime librerie open-source che possono occuparsi del resto ma ci arriverò più avanti.

Nulla vieta che possa interessarti di più altro, come da esempio l’AI, in questo caso ti va di fortuna comunque visto che sono disponibili anche molti motori di rendering già pronti.

Matematica

La matematica è un aspetto che, se vuoi sviluppare un motore grafico, devi approfondire.

Non spaventarti, non serve essere dei fisici o degli ingegneri, basta soffermarsi e studiare un attimo. Non è nulla di ultra-complicato.

Gli argomenti da approfondire dipendono molto da cosa vuoi fare con la computer grafica. Qui di seguito ti elencherò una piccola lista di aree che faresti bene a studiare prima di iniziare:

  • Algebra
  • Algebra lineare
  • Trigonometria

Nulla vieta che, nel caso dovessi incontrare delle formule matematiche che non conosci, di fermarti e approfondire l’argomento (anzi!).

Dove studiare? Ci sono due modi possibili: cercare ciascuno degli argomenti che ti ho elencato su Google e approfondire o leggere libri dedicati.

Ovviamente la lettura di un libro di permette di avere una preparazione più lineare e meno frammentata, credo sia il caso di dire che la programmazione grafica è uno di quegli argomenti che vanno studiati, per la maggior parte del tempo, sui libri.

Che libro prendere? Ecco a te la risposta:

Come dici? Il prezzo è alto? Ricordati che questo non è un romanzo rosa ma un libro con informazioni di valore e il valore si paga.

Programmazione: linguaggio C++

Essendo un motore grafico un tipo di software non triviale è necessario avere un po’ di esperienza nella programmazione, almeno 1/2 anni sono necessari ma questa è una mia opinione, potrei sbagliare.

Il linguaggio più adatto è il C++ per le seguenti ragioni tecniche:

  • È un linguaggio compilato (maggiori performance)
  • Offre la possibilità di eseguire operazioni di basso livello (l’esempio più comune è la gestione della memoria con i puntatori)
  • Storicamente il C++ è IL linguaggio per realizzare applicativi 3D al alte performance
  • Tutti gli esempi, librerie, documentazioni, ecc… prendono in esame il C++ (o al massimo il C, escludendo Java/OpenGL ES per Android)

Se non conosci molto bene il C++ è arrivato il momento di approfondire, ecco quali sono i miei consigli:

Non hai mai toccato il C++ in vita tua ma sai già programmare? Questo è il libro per te:

Se invece hai studiato un po’ il C++ in passato e sei impaziente di riprenderlo in mano:

API grafiche

Le API grafiche sono gli strumenti con il quale puoi realizzare il motore di rendering. Un motore grafico può implementare più API grafiche differenti, a seconda della piattaforma.

Facciamo un esempio pratico con il motore grafico oggi più popolare: Unity3D. Esso utilizza le DirectX su Windows e Xbox, le OpenGL su ambiente Linux, le OpenGL ES su Android, le Apple Metal su MacOS, le GNM su PlayStation e altro ancora…

Quello che in genere viene fatto dai professionisti è creare un’astrazione delle chiamate alle API grafiche, in modo da rendere il motore di rendering in grado di supportare più piattaforme.

Ad oggi ci troviamo in una situazione un po’ particolare nel panorama delle API grafiche.

Fino a due anni fa, per uno sviluppatore indipendente, era semplice, si trattava di scegliere tra DirectX e OpenGL. Fine. Le API più “moderne” erano già emerse ma non ricoprivano un ruolo pesante come invece accade oggi.

Quali sono le API del panorama attuale?

  • OpenGL: si tratta delle API grafiche open-source per eccellenza. Sono state l’unica alternativa, per molti anni, alle DirectX di Microsoft. Se il tuo software deve supportare tutti i sistemi operativi le OpenGL restano ancora una scelta solida e sicura (escludendo l’ambiente MacOS e iOS).
  • OpenGL ES: un subset delle OpenGL per i dispositivi embedded, come gli smartphone.
  • Vulkan: sono delle API grafiche di nuova generazione, rilasciate dagli stessi autori delle OpenGL, per questo motivo vengono viste un po’ come i successori di queste ultime. Supportano tutti gli OS tranne MacOS e iOS.
  • DirectX: le API grafiche di Microsoft, storicamente la scelta più popolare per la realizzazione di videogiochi non mobile, nonostante sia possibile utilizzarle sono su Windows e Xbox.
  • Metal: le API grafiche di Apple, presentate molto recentemente: nel 2014. La svolta è arrivata però da quando, nel 2018, Apple ha deciso di deprecare le OpenGL/OpenGL ES sui suoi sistemi operativi, rendendo di fatto le Metal le uniche librerie supportate ufficialmente.
  • API per console: un’altra categoria sono le API grafiche delle console da gioco, ogni console ha le sue. PlayStation usa le GNM, mentre Wii U usava altre API ancora, Nintendo Switch ha le sue, ecc…

Ma non esiste quindi una API grafica che supporta tutti i dispositivi? No, sfortunatamente, visto che Apple ha deciso di deprecare le OpenGL e di non supportare Vulkan, nessuna API supporta tutte le piattaforme.

In verità però esistono delle librerie grafiche a basso livello che appoggiandosi alle API appena elencate forniscono un’astrazione, fornendoti un’unica interfaccia di programmazione grafica e facilitandoti il lavoro.

Queste librerie però sono adatte solo per professionisti che hanno già esperienza nella realizzazione di applicativi 3D, quindi per ora non fanno al caso tuo, se devi imparare. Considera che la documentazione di queste librerie è praticamente assente perché, essendo il loro target sviluppatori 3D già esperti, fanno riferimento direttamente agli esempi e al codice sorgente.

Tuttavia elencherò queste librerie qui di seguito, in modo che tu possa tenerle a mente per futuri progetti, se migliorerai le tue skill in questo campo:

  • BGFX (GitHub): sono un’astrazione delle varie API elencate fino ad ora e sono state utilizzate per la realizzazione di vari applicativi e motori grafici, anche italiani come il game engine Crown o l’emulatore MAME
  • The Forge (GitHub): un’altra astrazione per creare un motore di rendering. A differenza di BGFX però supporta anche le console di gioco (PS4, XboxOne, addirittura Stadia… il codice per queste piattaforme non è su GitHub per una questione di licenze, per averlo però basta contattarli). The Forge è meno indicato agli indie developers e più indicato ai professionisti dell’industria videoludica.
  • MoltenGL: strumenti per garantire il supporto alle OpenGL su MacOS e iOS (basate su Metal)
  • MoltenVK: strumenti per garantire il supporto alle Vulkan su MacOS e iOS (basate su Metal)

Ok, non ci hai capito qualcosa? 🙂

Ma non perdiamo di vista il tuo obbiettivo: imparare la programmazione grafica.

Se il tuo obbiettivo sono i videogiochi, esiste un libro introduttivo ottimo per il tuo scopo. Esso ti guiderà nel creare un gioco da zero utilizzando il C++ con OpenGL e altre librerie molto utilizzate dai professionisti del settore, come le FMOD:

L’approccio migliore per chi parte dal nulla è scegliere comunque tra DirectX o OpenGL, ignorando le altre API. Quindi andiamo a vedere quando scegliere una o l’altra.

Iniziare con le DirectX

Le DirectX, in ambito videogiochi, sono uno standard di riferimento dell’industria. Spesso odiate dai fanatici delle OpenGL rappresentano le librerie principali per la programmazione grafica su Windows e su Xbox (anche se l’implementazione è diversa tra console e PC).

Praticamente tutti i videogiochi tripla A fanno uso delle DirectX. Se un gioco è uscito su Xbox usa le DirectX, se è uscito su PC Windows è molto probabile usi le DirectX e se il gioco è disponibile anche su Linux è comunque probabile che su Windows utilizzi un layer grafico basato su DirectX.

Il mio consiglio personale è di iniziare con le DirectX se volete programmare videogiochi per PC Windows prima e per console da gioco poi.

La documentazione online di Microsoft sulle DirectX è fatta molto bene

Dove iniziare per imparare? Ho per te il giusto libro:

Questo libro, integrato con la documentazione ufficiale di Microsoft, è di grande valore.

Iniziare con le OpenGL

Se le DirectX sono considerate uno standard per l’industria videoludica le OpenGL sono invece considerate uno standard per tutti gli altri applicativi 3D.

Giochi smartphone, applicazioni 3D industriali, sistemi embedded… tutto basato su OpenGL. Un esempio: hai presente tutti quegli effetti 3D sul virtual cockpit delle auto moderne? Realizzato con Qt e OpenGL.

Il mio consiglio è di iniziare con le OpenGL se vuoi realizzare applicativi 3D industriali o giochi per smartphone. Anche in Italia, in passato, ho letto di offerte di lavoro su OpenGL, in ambito automotive.

Mi sento di consigliarti le OpenGL anche se vorresti fare il programmatore grafico come dipendente a tempo pieno, vista la maggioranza di offerte di lavoro rispetto alle DirectX.

Dove iniziare con le OpenGL? Dal libro giusto:

Ok, sei pronto?

Una volta che avrai scelto e approfondito una delle due popolari API grafiche, arriva il momento di fare il passo successivo: iniziare a realizzare il tuo motore grafico.

In particolare voglio menzionarti un libro, scritto da una persona che ha lavorato nell’industria per tanti anni, arrivato alla terza edizione.

Tra le aziende per il quale ha lavorato l’autore figura Naughty Dog, in particolare l’autore ha preso parte allo sviluppo della saga di Uncharted (ricordi che grafica per una PS3 del 2006?):

Questo libro, arrivato alla terza edizione, ti fornisce una visione completa dell’architettura di un motore di gioco. Leggi le recensioni su Amazon, per farti un’idea di quanto sia valido.

Argomenti avanzati

La programmazione delle schede video (GPU) è molto diversa dalla tradizionale programmazione.

Nonostante questo sono presenti innumerevoli best-practises e tecniche avanzate, che ti renderanno migliore nel campo. Dovresti vederle un po’ come il “passo successivo” per “aumentare di livello” (parlando per metafore).

Arrivati a questo punto, dove approfondire dipende da te, ci sono tantissimi libri che potrebbero ancora interessarti.

Il momento di vendere

Ok, una volta realizzato il software che si fa?

Si vende ovviamente! Avere nuovi clienti e utilizzatori del tuo software è sempre una priorità.

Devo darti una brutta notizia: limitandoti a mettere la tua roba online e vedere che succede fallirai. Sarà un flop totale.

Cerca di trovare la tua nicchia e di comprendere il mercato dell’intrattenimento digitare, le soddisfazioni non tarderanno ad arrivare:

Ti auguro un sincero in bocca al lupo, per tutti i tuoi progetti.

Scrivi quello che pensi qui

Il tuo indirizzo email non sarà pubblicato.

Immagine non utilizzabile esternamente.