2016-03-17 3 views
6

three.js автоматически изменяет размер изображения текстуры, если это не сила двух. В моем случае я использую пользовательский холст в качестве текстуры, которая не сила two.while изменения размеров делает текстуры не появляются properly.Is там какой-либо способ отключить изменение размера изображений в Three.jsКак отключить three.js, чтобы изменить размеры изображений в силе двух?

ответ

14

три .js на самом деле пытается сделайте пожалуйста.

Поскольку он является открытым исходным кодом, мы можем прочитать исходный код WebGLRenderer.js и увидеть, что метод setTexture вызывает метод (не публичный видимый) uploadTexture.

Последние имеет такую ​​проверку:

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

    image = makePowerOfTwo(image); 
} 

Который вполне пояснительную себя.

Вы можете задаться вопросом, что именно textureNeedsPowerOfTwo действительно проверяет. Посмотрим.

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

Если вы используете оберточной для текстуры координированного отличается от зажима или если вы используете фильтрацию, которая не ближайшего ни линейный текстура получает масштабируется.

Если вы удивлены этим кодом Я настоятельно рекомендую вам, чтобы посмотреть на MDN page on using textures.

Цитирование

загвоздка: эти текстуры [Non Сила двух текстур] не может быть использована с Mipmapping, и они не должны «повторить» (плитка или компресс).

[...]

Без выполнения вышеописанной конфигурации, WebGL требует, чтобы все образцы NPOT [Non Power Of Two] текстуры на провал, возвращая черного цвета RGBA (0,0,0,1).

Таким образом, используя текстуры NPOT с некорректных параметров текстуры даст вам хороший старый твердый черный.


С Three.js является открытым исходным кодом, вы можете изменить локальную копию и удалить «оскорбительный» чек.

Однако лучший, простой и более удобный подход - просто масштабировать отображение UV. В конце концов, это только для этого варианта использования.

+0

Красиво ответил. :) –

Смежные вопросы