2013-05-19 13 views

risposta

9

WebGL deve applicare il comportamento di OpenGL ES 2.0 e impedire alle app WebGL di accedere ai dati a cui non hanno accesso. Per fare questo, le implementazioni WebGL devono convalidare molte cose, incluso che tutte le trame che saranno lette da sono leggibili secondo la specifica OpenGL ES 2.0 senza estensioni.

Quindi, ad ogni estrazione, devono controllare se tutte le trame soddisfano tutti i criteri richiesti che includono il controllo che ogni trama è "trama completa", se è una mappa cubica che è "cubo completo" e "mipmap" cubo completo ", se si tratta di dimensioni non-power-of-2 che il filtro trama è impostato correttamente, ecc ... Se una di queste condizioni non viene soddisfatta, l'implementazione WebGL sostituirà una trama nera trasparente in modo tale che il comportamento sia conforme alle specifiche e coerente su tutti i dispositivi.

Queste verifiche sono costose, quindi una scorciatoia che un'implementazione WebGL può eseguire è quella di tenere traccia di eventuali texture non trasmissibili. Se nessuna texture è invendibile, non è necessario alcun controllo al momento del disegno. L'avvertenza sopra è che alcune texture non sono riproducibili, il che significa che WebGL deve fare tutto questo controllo costoso. Se si assicura che tutte le trame siano renderizzabili, WebGL può saltare questo controllo e l'app potrebbe essere più veloce.

Per le definizioni di "texture completo", "cubo completo", ecc ... vedere OpenGL ES 2.0 spec section 3.7.10

+6

Se si utilizza Three.js, può essere causato da un utilizzo errato di THREE.ImageUtils.loadTexture. È necessario attendere il callback loadTexture, prima di aggiungere mesh con questa texture alla scena. – dIsoVi

+0

@dIsoVi Bravo! Tutti gli esempi che ho visto finora non usano il callback, quindi non sapevo nemmeno che fosse asincrono. Grazie! – krb686

+0

Non conosco i dettagli di Three.JS ma di solito piuttosto che aspettare che una texture si carichi prima di aggiungere una mesh alla scena creo una trama di 1x1 pixel e carica l'immagine in quella texture. In questo modo posso disegnare la mesh immediatamente poiché una trama da 1x1 pixel soddisfa tutti i requisiti di rendering. Una volta caricata l'immagine, aggiornerò la trama con i dati dell'immagine e quindi imposterai il filtro e/o genererò i mips. In questo modo posso avviare il rendering immediatamente. Spetta a te se quella soluzione si adatta alla tua app. – gman