2016-03-17 7 views

risposta

14

tre .js attualmente sta provando a un favore.

Poiché è open source, è possibile leggere il codice sorgente di WebGLRenderer.js e vedere che il metodo setTexture chiama il metodo (non visibile al pubblico) uploadTexture.

Quest'ultimo ha questo controllo:

if (textureNeedsPowerOfTwo(texture) && isPowerOfTwo(image) === false){ 

    image = makePowerOfTwo(image); 
} 

che è abbastanza esplicativo stessa.

Ora potreste chiedervi cosa controlli effettivamente lo textureNeedsPowerOfTwo. Vediamo.

function textureNeedsPowerOfTwo(texture) { 

     if (texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping) return true; 
     if (texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter) return true; 

     return false; 
} 

Se si utilizza avvolgendo per la trama coordinata diverso da morsetto o se si utilizza un filtro che non è vicinalineare la trama viene scalata.

Se siete sorpresi da questo codice vi consiglio caldamente di di dare un'occhiata allo MDN page on using textures.

Citando

La cattura: queste texture [Non potenza di due trame] non può essere utilizzato con mipmapping e non devono "repeat" (piastrelle o in un involucro).

[...]

senza eseguire la configurazione di cui sopra, WebGL richiede che tutti i campioni di NPOT [non potenza di due] texture per fallire restituendo nere: RGBA (0,0,0,1).

Quindi, utilizzando una texture NPOT con parametri della texture non corretti darebbe il buon vecchio solido nero.


Dal Three.js è open source, è possibile modificare la copia locale e rimuovere il controllo "incriminato".

Tuttavia, un approccio migliore, più semplice e più gestibile consiste semplicemente nel ridimensionare la mappatura UV UV. Dopotutto è lì solo per questo caso d'uso.

+0

Ben risposto. :) –

Problemi correlati