A glimpse of city

textureUtils.js

Panoramica

Questa documentazione copre una serie di funzioni JavaScript per la gestione della creazione di texture, la generazione di vettori tangenti per il normal mapping e l'attivazione o disattivazione di funzionalità di rendering come il normal mapping, la trasparenza e le riflessioni in un contesto WebGL. Queste utility supportano geometrie sia indicizzate che non indicizzate, aiutando nelle tecniche di rendering avanzato.

Funzioni

isPowerOf2(value)

Descrizione: Determina se un valore numerico è una potenza di 2, utile per l'ottimizzazione delle dimensioni delle texture nel rendering.

Funzionamento: Controlla se il numero ha un singolo bit impostato a 1, utilizzando un'operazione bitwise.

Parametri:

  • value (Number): Il numero da controllare.

Ritorna:

  • Boolean: true se il numero è una potenza di 2, altrimenti false.

Funzionamento: La funzione utilizza una tecnica bitwise per verificare la condizione. Se un numero è una potenza di 2, ha un solo bit impostato a 1 nel suo formato binario. La sottrazione di 1 da tale numero invertirebbe tutti i bit a destra di quel bit singolo, rendendo quindi l'operazione value & (value - 1) uguale a 0. Questo metodo è molto efficiente poiché evita cicli o operazioni più complesse.

Parametri:

  • value (Number): Il numero intero positivo che deve essere verificato.

Ritorna:

  • Boolean: Restituisce true se il numero è una potenza di 2, altrimenti false.

create1PixelTexture(gl, pixel)

Descrizione: Questa funzione crea una texture di 1x1 pixel, che funge da segnaposto temporaneo in applicazioni di grafica 3D. È particolarmente utile quando si deve iniziare a lavorare con una texture che non è ancora stata caricata, permettendo al programmatore di evitare errori di rendering o tempi morti visivi. La texture segnaposto viene successivamente sostituita con una texture più complessa una volta che i dati dell'immagine sono completamente caricati.

Funzionamento:

  • Creazione della Texture: La funzione utilizza gl.createTexture() per creare un nuovo oggetto texture nel contesto WebGL.
  • Binding della Texture: La texture appena creata viene "bindata" al contesto WebGL tramite gl.bindTexture(gl.TEXTURE_2D, texture), rendendola la texture corrente su cui operare.
  • Definizione della Texture: La funzione definisce la texture come un'immagine di 1x1 pixel utilizzando gl.texImage2D(), impostando i canali di colore secondo i valori forniti nel parametro pixel.

Parametri:

  • gl (WebGLRenderingContext): Il contesto WebGL che gestisce lo stato e le operazioni di rendering.
  • pixel (Array): Un array di 4 numeri interi che rappresentano i valori RGBA del colore del pixel, con ogni valore che può variare da 0 a 255.

Ritorna:

  • WebGLTexture: Restituisce un oggetto WebGLTexture rappresentante la texture 1x1 creata.

createTexture(gl, url)

Descrizione: Crea una texture a partire da un'immagine specificata da un URL. La funzione gestisce sia la creazione immediata di una texture segnaposto (inizialmente un pixel blu 1x1), sia il caricamento asincrono dell'immagine vera e propria, che sostituirà la texture segnaposto una volta caricata. È una funzione cruciale per caricare e gestire le texture nelle applicazioni WebGL in modo efficiente e senza bloccare l'esecuzione del programma.

Funzionamento:

  • Creazione della Texture Segnaposto: La funzione crea una texture 1x1 di colore blu utilizzando la funzione create1PixelTexture().
  • Caricamento Asincrono dell'Immagine: Utilizza un oggetto Image per caricare l'immagine da un URL fornito, sostituendo la texture segnaposto con l'immagine caricata una volta che questa è disponibile.
  • Aggiornamento della Texture: Una volta che l'immagine è caricata, la funzione aggiorna la texture nel contesto WebGL con i nuovi dati dell'immagine, applicando eventuali impostazioni di wrapping e mipmapping.

Parametri:

  • gl (WebGLRenderingContext): Il contesto WebGL che gestisce lo stato e le operazioni di rendering.
  • url (String): L'URL dell'immagine che deve essere caricata come texture.

Ritorna:

  • WebGLTexture: Restituisce un oggetto WebGLTexture rappresentante la texture creata dall'immagine.

generateTangents(vertices, indices, texCoords, normals)

Descrizione: Genera tangenti per la geometria, necessarie per il normal mapping in WebGL.

Funzionamento: Calcola vettori tangenti per ogni vertice della geometria basandosi su coordinate texture, indici e normali.

Parametri:

  • vertices (Array): Vertici della geometria.
  • indices (Array): Indici della geometria.
  • texCoords (Array): Coordinate texture della geometria.
  • normals (Array): Normali della geometria.

Ritorna:

  • Array: Array di vettori tangenti generati.

Note

  • Compatibilità e Performance: L'uso di texture con dimensioni potenze di 2 (POT) non è solo una restrizione tecnica, ma anche una pratica che migliora le performance. Texture POT consentono l'uso efficiente di funzionalità come mipmapping e wrapping modes avanzati, riducendo l'utilizzo della memoria GPU e migliorando la velocità di rendering. Anche se WebGL supporta texture con dimensioni non potenze di 2 (NPOT), queste possono comportare limitazioni, come l'impossibilità di utilizzare mipmapping, e possono causare problemi di compatibilità su dispositivi meno recenti o con driver grafici obsoleti.
  • Precisione vs. Performance nella Generazione dei Vettori Tangenti: La generazione dei vettori tangenti può essere computazionalmente intensiva, soprattutto per modelli complessi con un alto numero di vertici. Vettori tangenti accurati sono essenziali per un normal mapping efficace, contribuendo a dettagli di superficie realistici senza aumentare la complessità geometrica del modello. Ciò è particolarmente importante in applicazioni come simulazioni dove l'immersione visiva è cruciale.
  • Fluidità dell'Interfaccia: L'uso di caricamento asincrono (come nella funzione createTexture) non è solo una misura per evitare che il thread principale si blocchi, ma è anche un passo importante per migliorare l'esperienza utente. In un'applicazione web, l'asincronicità consente al rendering e all'interazione dell'utente di proseguire senza interruzioni anche quando risorse come immagini e texture richiedono tempo per essere caricate.