Three.js: BasisTextureLoader: следующие шаги

Созданный на 22 мая 2019  ·  60Комментарии  ·  Источник: mrdoob/three.js

Первоначальная поддержка текстур .basis добавлена ​​в https://github.com/mrdoob/three.js/pull/16522. Эта проблема отслеживает оставшуюся очистку и запланированные улучшения. Я еще не работаю над этим и обновлю эту проблему, когда начну, поэтому пока приветствуются PR:

  • [x] Очистить оставшиеся TODO в коде
  • [x] Применить исправления eslint
  • [x] Добавить документацию
  • [x] Добавить пример
  • [x] Добавить метод setMaxWorkers()
  • [x] Поддержка MIP-карт
  • [] Исправить поддержку mipmap в iOS
  • [] Перекомпилировать базовый транскодер с начальной загрузкой, предложенной @austinEng
  • [] Возврат текстуры синхронно из load() (без альфа?)
  • [] Поддержка альфа
  • [] Поддержка настраиваемого пользователем формата вывода перекодирования.
  • [x] Добавить модуль ES
Enhancement Loaders

Самый полезный комментарий

Этот обходной путь (в работнике непосредственно перед вызовом перекодировки), похоже, работает для меня. Конечно, это нужно исправить в транскодере, но это легко проверить в JS:

var mipWidth = basisFile.getImageWidth( 0, mip );
var mipHeight = basisFile.getImageHeight( 0, mip );
var mipSize = basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format );

if ( config.pvrtcSupported ) {

    // Basis incorrectly computes mip sizes for PVRTC, let's fix them up using the spec:
    // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt
    mipSize = Math.floor((Math.max(mipWidth, 8) * Math.max(mipHeight, 8) * 4 + 7) / 8);

}

var dst = new Uint8Array( mipSize );

Все 60 Комментарий

Я еще не изучал код подробно, но можем ли мы синхронно вернуть texture из load как это делают другие загрузчики текстур?

Я думаю, это хорошо для последовательности. И если мы не возвращаем текстуру синхронно, пользователю необходимо вызвать material.needsUpdate = true в обратном вызове (если цикл анимации уже запущен).

var material = new XXXMaterial();
textureLoader.load(..., function (texture) {
  material.map = texture;
   // .map is from null to non-null.
   // User needs to call material.needsUpdate = true here if already started animation loop
   // because whether material.map is null or not affects the final shader code.
  material.needsUpdate = true;
});

Я еще не проверял, что работает с THREE.CompressedTexture , но если да, то я согласен, что это будет лучше всего. 👍

Другая очистка: свойства, назначенные текстуре, немного произвольны (остались из демонстрации Basis), например flipY=false . И в воркере есть неиспользуемая переменная startTime .

Если я прав, похоже, что MIP-карты не поддерживаются. Транскодер не поддерживает? Или загрузчик еще не реализовал поддержку MIP-карт?

Да, файл .basis может содержать несколько уровней mipmap. Я думаю, что транскодер уже поддерживает это, но я этого не проверял. BasisTextureLoader пока не поддерживает его.

Мы также должны обновить транскодер до новой / меньшей версии: https://github.com/BinomialLLC/basis_universal/pull/7~~ Готово.

Ага, транскодер должен это поддерживать. Вы передаете уровень mip как от levelIndex до transcodeImage .
https://github.com/BinomialLLC/basis_universal/blob/master/webgl/transcoder/basis_wrappers.cpp#L197

Спасибо за ваши объяснения.

И если есть какие-либо другие функции, которые загрузчик еще не поддерживает, но транскодер поддерживает, о которых вы знаете, добавьте в список TODO. Мы можем помочь в реализации.

Сделал пример. # 16553 Это может быть слишком просто, пожалуйста, не стесняйтесь улучшить / заменить позже, если он будет объединен.

Что касается других функций, которые транскодер имеет, но нет THREE.BasisTextureLoader, ключевое отличие состоит в том, что транскодер может выводить множество дополнительных форматов:

https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/BasisTextureLoader.js#L264 -L273

Честно говоря, я не знаю, когда использовать все это. Я ожидаю, что пользователь иногда захочет контролировать это, а в других случаях загрузчик (например, GLTFLoader) примет решение в зависимости от назначения текстуры. Например, он может выбрать другой сжатый формат для material.map (базовый цвет), чем для material.aoMap (окружающая окклюзия).

Самый очевидный способ поддержать это - добавить альтернативу detectSupport( renderer ) :

// Let loader decide, based on device capabilities:
loader.detectSupport( renderer );

// Or, choose a particular format:
loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC4 );

В этом есть потенциальная проблема - если я загружаю несколько текстур, мы можем не захотеть перекодировать их все в один и тот же формат. Мы могли бы создать несколько загрузчиков, но тогда будет сложнее повторно использовать существующих Web Workers (что важно). Мы могли бы передать формат в метод load() , но тогда он не будет обратно совместим с TextureLoader. Думаю, лучше всего было бы убедиться, что это ...

loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC4 );
var fooTex = loader.load( 'foo.basis' );

loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC1 );
var barTex = loader.load( 'bar.basis' );

... всегда будет применять правильный формат к каждой текстуре, даже если декодирование является асинхронным.

Еще одно примечание, просто для того, чтобы это где-то отслеживалось: оболочка JS в examples/js/libs/basis содержит незначительное изменение по сравнению с версией в репозитории Basis. Первое объявление ( var Module ) заменяется просто Module чтобы включить ленивую инициализацию, используемую в Web Worker. Вероятно, это можно сделать по-другому, либо скомпилировав транскодер с разными флагами, либо через https://github.com/BinomialLLC/basis_universal/issues/21.

Должен ли BasisTextureLoader работать в тандеме с glTF? Я пробовал вручную кодировать текстуры в формат .basis и добавлять BasisTextureLoader в качестве загрузчика следующим образом:

var basisLoader = new THREE.BasisTextureLoader();
basisLoader.setTranscoderPath( 'basis/' );
basisLoader.detectSupport( renderer );

THREE.Loader.Handlers.add( /\.basis$/i, basisLoader );

Но текстуры не отображаются должным образом, и консоль имеет следующий вывод:

[.WebGL-000002B68031CEF0]RENDER WARNING: texture bound to texture unit 1 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.

та же проблема, что и описание

Я отладил это, и это происходит потому, что:

  1. Загрузчик glTF обычно устанавливает фильтрацию mag на LinearMipMapLinearFilter
  2. BasisTextureLoader не поддерживает MIP-карты
  3. webGL требует, чтобы цепочки mip были полными: - /

@zeux Официально не поддерживается - основная спецификация glTF допускает только текстуры JPEG и PNG. Но расширение для Basis (через оболочку KTX2) - это механизм, с помощью которого мы планируем добавить в формат поддержку сжатых текстур. См. Https://github.com/KhronosGroup/glTF/pull/1612 для черновиков расширений (здесь актуальны только первые два) и не стесняйтесь добавлять отзывы.

Тем не менее, отсутствие поддержки mipmap в BasisTextureLoader объясняется тем, что мы еще не дошли до этого. Насколько мне известно, сам транскодер должен поддерживать это.

Отправлен PR для исправления поддержки mipmap - при этом, пока вы конвертируете текстуры с опцией -mipmap , загрузчик glTF просто работает, пока вы добавляете загрузчик, как указано выше, по крайней мере, на рабочем столе. Мне не удалось запустить его на мобильном устройстве (iPhone или Android), но пример threejs.org с вращающимся кубом также не работает на iPhone, так что это может быть отдельной проблемой.

Мне не удалось запустить его на мобильном устройстве (iPhone или Android)

Из основных документов -

Например, на iOS для PVRTC1 можно использовать только квадратную степень двух размеров текстуры, и сегодня Basis ничего не может сделать для вас, чтобы обойти это ограничение. (Скоро мы будем поддерживать возможность транскодировать меньшие текстуры, отличные от pow2, в более мощные текстуры 2 PVRTC1.)

В этой демонстрации мы использовали текстуру 512x768 и, вероятно, должны заменить ее чем-то, что соответствует этому ограничению.

Хорошо, это имеет смысл. FWIW телефон Android, на котором я тестировал, имеет целый ряд проблем с несколькими демонстрациями WebGL, а не только с базовой текстурой - другой телефон Android работает нормально. Так что да, это, вероятно, просто ограничение силы двойки, которое проблематично для iOS.

Различные обновления для BasisTextureLoader доступны по адресу https://github.com/mrdoob/three.js/pull/16675.

Вероятно, нам также следует подумать о том, как поддерживать альфа-версию ... в документации Basis подробно описаны параметры (https://github.com/BinomialLLC/basis_universal/#how-to-use-the-system), но для некоторых устройства это включает в себя несколько выходов транскодирования:

Устройства / API только для ETC1: перекодируйте в две текстуры ETC1 и выберите их в шейдере. Вы можете использовать одну текстуру ETC1, которая вдвое выше, или две отдельные текстуры ETC1.

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

Переход на квадратную текстуру степени двойки в https://github.com/mrdoob/three.js/pull/16686 исправляет демонстрацию на iOS, но MIP-карты не работают:

INVALID_VALUE: compressedTexImage2D: длина ArrayBufferView не соответствует размерам.

Нужно ли нам делать что-то особенное для MIP-карт с PVRTC?

Это происходит на одном из последних мипов?

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

Я подозреваю, что Basis неправильно вычисляет размер (в байтах) последних нескольких MIP. Для PVRTC1 4bpp размеры блоков округляются до 8, поэтому 4x4, 2x2 и 1x1 должны быть того же размера, что и 8x8. Думаю, базисный транскодер обходится до 4х4. Все изображения размером 8x8, 4x4, 2x2, 1x1 должны занимать 32 байта; Я думаю, что для 4x4 и ниже Basis предполагает, что это всего лишь 1 блок 4x4, который составляет 8 байтов, и дает вам 8 байтов вместо 32. @ richgel999

Формула для вычисления размеров изображений находится здесь: https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt :

   For PVRTC 4BPP formats the imageSize is calculated as:
     ( max(width, 8) * max(height, 8) * 4 + 7) / 8

Этот обходной путь (в работнике непосредственно перед вызовом перекодировки), похоже, работает для меня. Конечно, это нужно исправить в транскодере, но это легко проверить в JS:

var mipWidth = basisFile.getImageWidth( 0, mip );
var mipHeight = basisFile.getImageHeight( 0, mip );
var mipSize = basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format );

if ( config.pvrtcSupported ) {

    // Basis incorrectly computes mip sizes for PVRTC, let's fix them up using the spec:
    // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt
    mipSize = Math.floor((Math.max(mipWidth, 8) * Math.max(mipHeight, 8) * 4 + 7) / 8);

}

var dst = new Uint8Array( mipSize );

Спасибо! Я исправлю это как можно скорее.

Ошибка с размером MIP-карты PVRTC1 должна быть исправлена. Мы исправили транскодер, чтобы он очищал лишние байты на небольших (менее 8 пикселей в ширину / в высоту) mips. И мы исправили обертку, чтобы вернуть правильные размеры. Пожалуйста, дайте мне знать, если есть какие-либо проблемы, и я исправлю их как можно скорее.

@donmccurdy Не могли бы вы добавить в texture из метода load »? (как предложил takahirox выше)

@ Ben-Mack Добавил. Обратите внимание: поскольку текстуры с альфа-каналом могут перекодироваться в несколько текстур, и мы не узнаем об этом синхронно, нам понадобится другой API для этого.

@ richgel999 Спасибо! У меня проблемы с восстановлением транскодера WASM, так как https://github.com/BinomialLLC/basis_universal/commit/ab722fa2e18536f9a1d5f33814f3088232446d52 обновил только webgl/transcoder/basis_wrappers.cpp . Компиляция в macOS:

$ emcmake cmake ../
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/donmccurdy/Documents/Projects/basis_universal/webgl/transcoder/build

$ make
[ 33%] Linking CXX executable basis_transcoder.js
Traceback (most recent call last):
  File "/Users/donmccurdy/Documents/Projects/emsdk/emscripten/1.37.22/em++", line 16, in <module>
    emcc.run()
  File "/Users/donmccurdy/Documents/Projects/emsdk/emscripten/1.37.22/emcc.py", line 882, in run
    exec 'shared.Settings.' + key + ' = ' + value in globals(), locals()
  File "<string>", line 1, in <module>
NameError: name 'emmalloc' is not defined
make[2]: *** [basis_transcoder.js] Error 1
make[1]: *** [CMakeFiles/basis_transcoder.js.dir/all] Error 2
make: *** [all] Error 2

Теоретически мы должны иметь возможность обновить транскодер и заменить текущую текстуру PavingStones.basis на эту, которая включает MIP-карты:

PavingStones.basis.zip

РЕДАКТИРОВАТЬ: К сожалению, это может быть связано с https://github.com/BinomialLLC/basis_universal/pull/27.

@donmccurdy Я считаю, что для этого необходимо объединить https://github.com/BinomialLLC/basis_universal/pull/27 , надеюсь, это может произойти в ближайшее время. Также ваша версия emscripten может предшествовать существованию emmalloc, файлы, которые в настоящее время являются частью three.js, были созданы с использованием 1.38.31, я думаю.

Эта ошибка возникла при попытке загрузить несколько базовых файлов одновременно:

Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'Worker': ArrayBuffer at index 0 is already neutered.

Для воспроизведения просто вызовите метод load 2 раза, например:

loader.load( 'textures/compressed/PavingStones.basis');
loader.load( 'textures/compressed/PavingStones.basis');

@ Ben-Mack Вероятно, все еще стоит исправить, но эта ошибка возникает только потому, что вы загружаете одну и ту же текстуру дважды, а загрузчик повторно использует ArrayBuffer, который не может быть передан двум рабочим одновременно. Приведенный ниже код выполняется за счет выполнения вдвое большей работы:

loader.load( 'textures/compressed/PavingStones.basis?v=1' );
loader.load( 'textures/compressed/PavingStones.basis?v=2' );

@donmccurdy За поддержку альфы как насчет чего-то вроде:

load(...) // as usual
//then :  
loader.getRGBTexture() //return by the load function as usual
loader.getAlphaTexture() //can be use as alphaMap

Возможность поддержки альфа-канала также может быть добавлена ​​к модели MIP-карты:
loader.generateAlpha = true //default

@ Makio64 Что-то в этом

const [ map ]           = loader.loadRGB( 'foo.basis', { ...options } );
const [ map, alphaMap ] = loader.loadRGBA( 'bar.basis', { ...options } );

^ В обоих случаях, но особенно в альфа-версии, я думаю, может быть достаточно разных способов сделать что-то, что потребует некоторой настройки метода.

Или вместо этого мы могли бы просто перейти на асинхронный режим работы с новыми методами:

loader.loadRGBA( 'bar.basis', { ...options }, ( map, alphaMap ) => {
  // ...
} );

Асинхронное решение выглядит более простым для реализации с рабочим и согласованным с другими загрузчиками threejs.

Я могу загружать текстуры только с разрешением 768 на 512 или 384 на 256 и т.д., любое другое разрешение не загружается с Three.js и BasisTextureLoader с предупреждением:
«Текстура, связанная с блоком текстуры 0, не может быть визуализирована. Возможно, она не имеет степени двойки и имеет несовместимую фильтрацию текстур».

@ mozg4D см. документацию Basis , в частности, в iOS требуются текстуры типа power-of-two. Если документация не соответствует тому поведению, которое вы видите, сообщите о новой ошибке. Также возможно, что выбранная фильтрация текстур несовместима, и в этом случае нам все равно понадобится демо, и будет полезна новая ошибка. Спасибо!

@donmccurdy Будет ли скоро выпущена альфа-поддержка Basis?

Думаю, я обнаружил ошибку: только на iOS есть странный эффект «свечения текстуры» по краям геометрии текстуры: # 17597

Кто-нибудь еще сталкивался с этим?

Я думаю, что на iOS он, скорее всего, будет использовать PVRTC. Такое бывает в более ранней версии (r108)?
Может быть, вы могли бы попробовать сообщить о проблеме на https://github.com/BinomialLLC/basis_universal?

Такое бывает в более ранней версии (r108)?

Ошибка, которую я зарегистрировал, относится к r108.

Может быть, вы могли бы попробовать сообщить о проблеме на https://github.com/BinomialLLC/basis_universal?

Как раз в процессе: https://github.com/BinomialLLC/basis_universal/issues/78

Думаю, я обнаружил ошибку: только на iOS есть странный эффект «свечения текстуры» по краям геометрии текстуры: # 17597

Я ответил на базе_universal github. Возьмем текстуру и посмотрим, что происходит. Скорее всего, это артефакт, связанный с неправильной установкой флага транскодирования адресации с переносом / ограничением, или артефакт, вызванный нашим кодировщиком PVRTC1 в реальном времени. Если проблема в любом из них, обычно существуют обходные пути. Мы также можем повысить качество PVRTC1 за счет увеличения времени процессора / памяти для транскодирования.

Я разместил обновление на https://github.com/BinomialLLC/basis_universal/issues/78#issuecomment -536159690 - скриншоты включены туда.

Он показывает проблему обертывания невращающегося куба.

Я обнаружил еще одну ошибку (но, скорее всего, не связанную): https://github.com/mrdoob/three.js/pull/17546#commitcomment -35275564

Я обнаружил еще одну ошибку (но, скорее всего, не связанную): # 17546 (комментарий)

Исправлено в # 17622.

Что касается MIP-карт, есть ли способ правильно загрузить файлы базовых текстур (указанные в файле .gltf) без необходимости встраивать MIP-карты в файл .basis?

Я могу заставить его загружать proplery, когда я создаю файл .basis с помощью -mipmap , однако это добавляет большой размер к файлу .basis, но когда я создаю файл .basis без -mipmap вариант, он просто отображается черным в браузере с помощью threejs.

Что касается MIP-карт, есть ли способ правильно загрузить файлы базовых текстур (указанные в файле .gltf) без необходимости встраивать MIP-карты в файл .basis?

Я могу заставить его загружать proplery, когда я создаю файл .basis с помощью -mipmap , однако это добавляет большой размер к файлу .basis, но когда я создаю файл .basis без -mipmap вариант, он просто отображается черным в браузере с помощью threejs.

На данный момент вы можете отключить MIP-карты, чтобы текстуры отображались:
https://discourse.threejs.org/t/compressed-texture-workflow-gltf-basis/10039/12?u=johannesdeml
https://github.com/JohannesDeml/three.js/commit/909d9cc6dc9192f398df7455f52b7e71e3bf61e2

Это, конечно, не поддерживает MIP-карты, но если ваша цель - просто показать текстуры, это может быть для вас простым решением.

Кажется, что это больше не работает, и похоже, что BasisTextureLoader теперь также имеет аналогичный код (установка min / magFilter = LinearFilter), когда обнаруживается только 1 mipmap (https://github.com/mrdoob/three.js /blob/e66e86901abd84ffc260fea9665170631a2b0493/examples/js/loaders/BasisTextureLoader.js#L170-L171) - это то, что генерирует basisu без параметра -mipmap . Однако он все еще черный.

Вы можете поделиться файлом? Я делал это совсем недавно, на прошлой неделе, хотя это был Basis в контейнере .ktx2 а не .basis ...

И просто для подтверждения - вы знаете, что вы не можете сгенерировать эти MIP-карты во время выполнения, и вам придется обходиться задействованными ограничениями интерполяции?

Конечно, спасибо, что заглянули!

body_green.basis.zip

И просто для подтверждения - вы знаете, что вы не можете сгенерировать эти MIP-карты во время выполнения, и вам придется обходиться задействованными ограничениями интерполяции?

Да, я тоже это понял, немного досадно, так как большая часть того выигрыша, который я наблюдал при меньшем размере файла .basis по сравнению со сжатым jpg, затем теряется - я знаю, что прирост памяти графического процессора все еще есть, но в основном я был ориентирован на размер загрузки / передачи текстуры.

И просто для подтверждения - вы знаете, что вы не можете сгенерировать эти MIP-карты во время выполнения, и вам придется обходиться задействованными ограничениями интерполяции?

Всегда ли это происходит при использовании основы вместо jpg / png?

Как насчет варианта использования упаковки 6 текстур в виде списка лиц для кубической карты в один базовый файл, поскольку формат поддерживает / упоминает это в README. Генератор PMREM здесь бесполезен, и в базовом файле должны быть MIP-карты для каждой сгенерированной текстуры?

Как насчет предоставления этих упакованных данных текстуры для использования в качестве кубической карты в ThreeJS? Обычно аргументы передаются для каждой отдельной текстуры? (Я еще не изучал поддержку этого загрузчика текстур, чтобы увидеть, возможен ли базовый файл с несколькими текстурами). Альтернативой, возможно, является KTX2, который может быть более подходящим для предоставления упакованного базового файла списка лиц для использования в качестве кубической карты?

Последний вопрос об этом использовании, поскольку вы обсуждали обработку альфа-канала, эти текстуры могут быть закодированы как RGBE или RGBM (ThreeJS поддерживает M7 и M16). Я не исследовал, насколько хорошо они сжимаются с базой, но у них могут быть проблемы, аналогичные известным картам нормалей. Данные альфа-канала довольно важны для поддержки там, я не уверен, в какой формат сжатых текстур они будут перекодированы, некоторые из них могут давать довольно плохие результаты, как указано в связанной статье ниже.

ARM, например, написала статью о проблемах с ASTC и RGBM . Механизм Unity, как упоминается в статье, использует RGBM5, который в большинстве случаев должен охватывать подходящий диапазон HDR, более низкий множитель предположительно вызовет меньше проблем с качеством сжатия, чем более высокая постоянная множителя, если данные попадают в пределы диапазона.

Извините, я не знаю ответа на эти вопросы. Возможно, вам повезет больше с репозиториями Basis Universal или KTX GitHub. Я знаю, что KTX2 разработан для поддержки кубических карт с полезными нагрузками Basis.

Я поднял их здесь, поскольку они казались подходящими случаями использования поддержки ThreeJS, которые обсуждаются здесь.

Basis может хранить все 6 текстур для кубической карты в одном файле основы. KTX2 с поддержкой Basis может лучше поддерживать кубические карты с несколькими текстурами, но с одним файлом afaik.

Неясно, сможет ли ThreeJS справиться с этим в будущем. Возможно, необходимо предоставить 6 различных базовых файлов или получить KTX2 с поддержкой базового загрузчика.

Для RGBM5 потребуется отдельный PR, это будет просто RGBM7 или RGBM16, которые в настоящее время существуют, или вариант, который требует униформы для регулировки значения множителя. Основная важная часть заключается в том, что с альфа-каналом нужно правильно обращаться для правильного сжатия, поэтому возможность иметь некоторый контроль над этим, как обсуждалось ранее в этом выпуске, является еще одним примером того, где это было бы полезно, например, с картами нормалей и их линейными / нецветное кодирование, которое также может иметь формат, разделенный на две возможные текстуры (из одноцветного RGB для X и альфа для Y в базовом файле) в зависимости от поддержки сжатия.

Three.js в настоящее время поддерживает Basis Universal. Новый формат Basis, UASTC, был выпущен всего несколько недель назад. Я не думаю, что до этого Basis поддерживал кубические карты в одном файле. Запросы на вытягивание приветствуются.

Выполняется загрузчик KTX2 с https://github.com/mrdoob/three.js/pull/18490.

В более старых версиях README for Basis (до UASTC, но все еще присутствующих в текущем README) упоминается функция упаковки нескольких текстур в один базовый файл:

Базовые файлы поддерживают неоднородные массивы текстур, поэтому кубические карты, объемные текстуры, массивы текстур, уровни MIP-карт, видеопоследовательности или произвольные текстурные «плитки» могут храниться в одном файле. Компрессор может использовать корреляции цвета и рисунка во всем файле, поэтому несколько изображений с MIP-картами могут быть очень эффективно сохранены в одном файле.

Запросы на вытягивание приветствуются.

Я бы не знал, с чего начать, и в настоящее время у меня нет свободного времени. Возможно, как только эта проблема будет решена и загрузчик KTX2 будет готов, поддержка сжатых / упакованных кубических карт может быть решена. Если к тому времени у меня будет свободное время, я с радостью постараюсь внести свой вклад в пиар :)

Привет всем, у меня периодически возникала проблема с iOS (ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааалосьалось значение!)
Обычно текстура иногда загружается нормально, иногда не отображается.
В консоли нет ошибок, загрузка составляет 100%, поэтому определенно не проблема сети.
Проверено как на официальном примере (https://threejs.org/examples/?q=basis#webgl_loader_texture_basis), так и на моем собственном проекте. На моем iPhone X в Safari текстура иногда появляется, а иногда нет.
На iPhone 6 Safari он никогда не появляется.
Все остальные выглядят нормально.
Что бы это могло быть?

[РЕДАКТИРОВАТЬ] та же проблема в Safari в Mac OS, но периодически

@igghera Похоже, это может быть ошибка, особенно если это происходит в официальном примере. Не могли бы вы открыть для этого новый выпуск? Спасибо!

Как можно добавить поддержку текстур 2D-массива в BasisTextureLoader ? Я немного изучил это, но не совсем уверен, что делать дальше.

Изменение функции transcode для перебора изображений из счетчика, возвращаемого basisFile.getNumImages() кажется простым, но похоже, что после этого нужно решить три вещи:

  1. compressedTexImage3D не существует в THREE.WebGLState и ему необходимо передать параметр для gl.TEXTURE_2D_ARRAY за WebGLRenderingContext.compressedTexImage3D
  2. API Basis возвращает отдельные MIP-карты для каждого индекса изображения, но вам нужен один большой объект текстуры для привязки за sampler2DArray ?
  3. CompressedTexture потребуется способ связать MIP-карты для каждого индекса изображения. Для изображения 200 глубокого массива и 6 уровней MIP-карты это будет 1200 записей MIP-карты, поэтому, вероятно, mipmaps в CompressedTexture станет полосатым массивом. Или есть способ, которым WebGL абстрагирует эту деталь?

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги