Introduzione a WebGL

Ciao a tutti, futuri maghi di WebGL! Benvenuti in questo emozionante viaggio nel mondo della grafica 3D sul web. Sono entusiasta di essere il vostro guida mentre esploriamo il mondo affascinante di WebGL. Come qualcuno che ha insegnato grafica computerizzata per più di un decennio, posso assicurarvi che mentre la strada davanti potrebbe sembrare difficile, è anche incredibilmente gratificante. Allora, mettetevi comodi e tuffiamoci!

WebGL - Introduction

Cos'è OpenGL?

Prima di immergerci in WebGL, facciamo una breve deviazione per comprendere il suo predecessore, OpenGL. Immagina di essere un artista che cerca di dipingere un capolavoro. OpenGL è come il tuo magico set di vernici e pennelli che ti permette di creare straordinarie opere visive sullo schermo del computer.

OpenGL, che sta per Open Graphics Library, è un'API (Application Programming Interface) cross-platform per la visualizzazione di grafica vettoriale 2D e 3D. È stato presente dal 1992 e ha été la spina dorsale di innumerevoli giochi, simulazioni e applicazioni visive.

Ecco una semplice analogia: Se lo schermo del computer è una tela, OpenGL è il set di strumenti che aiuta i programmatori a dipingere su quella tela con un dettaglio e una velocità incredibili.

Cos'è WebGL?

Ora, spostiamo l'attenzione sulla stella del nostro spettacolo: WebGL. Se OpenGL è il pennello per le applicazioni desktop, WebGL è il pennello per il web. È un'API JavaScript che ti permette di creare grafica 3D mozzafiato direttamente nel browser web, senza aver bisogno di alcun plugin.

WebGL porta la potenza di OpenGL ES 2.0 (una versione di OpenGL per sistemi embedded) sul web, permettendo agli sviluppatori di sfruttare la GPU (Graphics Processing Unit) direttamente attraverso JavaScript.

Ecco un semplice esempio "Ciao, Mondo!" in WebGL:

<canvas id="glCanvas" width="640" height="480"></canvas>
<script>
function main() {
const canvas = document.getElementById("glCanvas");
const gl = canvas.getContext("webgl");

if (gl === null) {
alert("Impossibile inizializzare WebGL. Il tuo browser o computer potrebbe non supportarlo.");
return;
}

gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
}

window.onload = main;
</script>

Questo codice crea una tela nera sulla tua pagina web. Potrebbe non sembrare molto, ma è il tuo primo passo nel mondo di WebGL!

Chi ha sviluppato WebGL

WebGL è stato sviluppato dal Khronos Group, gli stessi ragazzi dietro OpenGL. È stato introdotto per la prima volta nel 2011 e da allora ha rivoluzionato il modo in cui pensiamo alla grafica sul web.

Curiosità: Lo sviluppo di WebGL è stato ispirato da esperimenti svolti da Vladimir Vukićević presso Mozilla. Ha creato un elemento canvas che espose OpenGL ES a JavaScript, gettando le basi per ceea che sarebbe diventato WebGL.

Renderizzazione

La renderizzazione è il processo di generazione di un'immagine da un modello 2D o 3D. In WebGL, questo accade in tempo reale, il che significa che le immagini vengono generate al volo mentre interagisci con esse.

Ecco un semplice esempio che rende un triangolo rosso:

// Programma dello shader di vertice
const vsSource = `
attribute vec4 aVertexPosition;
void main() {
gl_Position = aVertexPosition;
}
`;

// Programma dello shader di frammento
const fsSource = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;

// ... (codice di inizializzazione)

// Disegna la scena
function drawScene(gl, programInfo, buffers) {
gl.clearColor(0.0, 0.0, 0.0, 1.0);  // Pulisci a nero, completamente opaco
gl.clearDepth(1.0);                 // Pulisci tutto
gl.enable(gl.DEPTH_TEST);           // Abilita il test di profondità
gl.depthFunc(gl.LEQUAL);            // Le cose vicine oscurano le cose lontane

// Pulisci la tela prima di iniziare a disegnare su di essa.
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

// ... (configura la scena)

{
const numComponents = 2;  // Estrai 2 valori per iterazione
const type = gl.FLOAT;    // I dati nel buffer sono float a 32 bit
const normalize = false;  // Non normalizza
const stride = 0;         // Quanti byte per passare da un set di valori al successivo
const offset = 0;         // Quanti byte all'interno del buffer da cui iniziare
gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position);
gl.vertexAttribPointer(
programInfo.attribLocations.vertexPosition,
numComponents,
type,
normalize,
stride,
offset);
gl.enableVertexAttribArray(
programInfo.attribLocations.vertexPosition);
}

// Indica a WebGL di utilizzare il nostro programma quando disegna
gl.useProgram(programInfo.program);

{
const offset = 0;
const vertexCount = 3;
gl.drawArrays(gl.TRIANGLES, offset, vertexCount);
}
}

Questo codice imposta gli shader e i buffer necessari per rendere un semplice triangolo rosso sullo schermo.

GPU

GPU sta per Graphics Processing Unit. È un processore specializzato progettato per gestire le complesse operazioni matematiche coinvolte nella renderizzazione della grafica. Mentre i CPU sono ottimi per il calcolo generico, le GPU eccellono nell'eseguire molte semplici operazioni in parallelo, il che è perfetto per il lavoro grafico.

Pensa in questo modo: se rendere una scena complessa 3D è come dipingere un murale di grandi dimensioni, il CPU è come avere un singolo artista estremamente talentuoso, mentre la GPU è come avere migliaia di artisti decenti che lavorano insieme.

Calcolo Accelerato pela GPU

Il calcolo accelerato pela GPU si riferisce all'uso di una GPU insieme a un CPU per accelerare applicazioni scientifiche, analitiche, ingegneristiche, consumer e aziendali. Nel contesto di WebGL, significa che i tuoi calcoli grafici vengono spostati sulla GPU, liberando il CPU per altri compiti e resulting in una grafica più fluida e veloce.

Browser Supportati

La bellezza di WebGL è il suo ampio supporto su browser moderni. A partire dal 2023, WebGL è supportato da:

Browser Versione
Chrome 9+
Firefox 4+
Safari 5.1+
Opera 12+
Internet Explorer 11+
Microsoft Edge 12+

Vantaggi di WebGL

WebGL offre numerosi vantaggi:

  1. Compatibilità cross-platform: Scrivi una volta, esegui ovunque (finché c'è un browser).
  2. Nessun plugin richiesto: È integrato nel browser.
  3. Accelerazione hardware: Utilizza la GPU per una migliore performance.
  4. Integrazione con tecnologie web: Può essere combinato con altre API web per esperienze ricche e interattive.
  5. Standard aperto: Chiunque può contribuire al suo sviluppo.

Configurazione dell'Ambiente

Configurare il tuo ambiente WebGL è sorprendentemente semplice. Tutto ciò di cui hai bisogno è:

  1. Un browser web moderno
  2. Un editor di testo (ti consiglio Visual Studio Code)
  3. Un server web locale (puoi usare il server integrato di Python o http-server di Node.js)

Ecco un semplice processo di configurazione:

  1. Crea una nuova directory per il tuo progetto
  2. Crea un file HTML (ad esempio, index.html) e un file JavaScript (ad esempio, script.js)
  3. Nel tuo file HTML, includi il tuo file JavaScript e configura un canvas:
<!DOCTYPE html>
<html>
<head>
<title Il mio Primo Progetto WebGL</title>
</head>
<body>
<canvas id="glCanvas" width="640" height="480"></canvas>
<script src="script.js"></script>
</body>
</html>
  1. Nel tuo file JavaScript, inizializza WebGL:
function main() {
const canvas = document.getElementById("glCanvas");
const gl = canvas.getContext("webgl");

if (gl === null) {
alert("Impossibile inizializzare WebGL. Il tuo browser o computer potrebbe non supportarlo.");
return;
}

// Codice WebGL qui
}

window.onload = main;

Ecco fatto! Ora sei pronto per iniziare il tuo viaggio con WebGL. Ricorda, imparare WebGL è come imparare a guidare una bicicletta - all'inizio potrebbe sembrare instabile, ma con la pratica, sarai in grado di muoverti rapidamente in nessun tempo. Buon codice!

Credits: Image by storyset