three.js automatycznie zmienia rozmiar obrazu tekstury, jeśli nie jest to moc dwóch. W moim przypadku używam niestandardowego płótno jako tekstury, który nie jest moc two.while zmiana rozmiaru sprawia, że struktura nie pojawia properly.Is jakiś sposób, aby wyłączyć zmianę rozmiaru obrazów w Three.jsJak wyłączyć three.js, aby zmienić rozmiar obrazów w potędze dwóch?
Odpowiedz
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.
Nicely odpowiedział. :) –