2016-03-17 25 views

Odpowiedz

14

trzy .js w rzeczywistości próbuje czy ci przysługę.

Ponieważ jest to oprogramowanie typu open source, możemy przeczytać kod źródłowy WebGLRenderer.js i przekonać się, że metoda setTexture wywołuje metodę (niewidoczną publicznie) uploadTexture.

Ten ostatni ma ten test:

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

    image = makePowerOfTwo(image); 
} 

który jest dość wyjaśniająca się.

Może zastanawiasz się, co faktycznie sprawdza textureNeedsPowerOfTwo. Zobaczmy.

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; 
} 

Jeśli używasz owijania dla tekstury koordynowanego różni się od zacisku lub jeśli używasz filtrowania, która nie jest najbliższy ani liniowy faktura zostanie przeskalowany.

Jeśli jesteś zaskoczony tym kodem , zdecydowanie sugeruję, aby spojrzeć na MDN page on using textures.

Cytowanie

The haczyk: tych tekstur [Non moc dwóch tekstur] nie może być używany z mipmappingu i nie mogą „repeat” (dachówka lub okład).

[...]

bez wykonywania powyższej konfiguracji, WebGL wymaga, aby wszystkie próbki NPOT [Non moc dwóch] tekstur na niepowodzenie wracając czarne: rgba (0,0,0,1).

Więc używając NPOT tekstury z nieprawidłowych parametrów tekstury nie daje dobrego stary solidną czarną.


Od Three.js jest open source, można edytować lokalną kopię i usuń "przestępstwa" czek.

Jednak lepszym, prostszym i łatwiejszym w obsłudze rozwiązaniem jest po prostu skalowanie mapowania UV. Przecież jest tylko dla tego przypadku użycia.

+0

Nicely odpowiedział. :) –