Three.js: BasisTextureLoader: Pasos siguientes

Creado en 22 may. 2019  ·  60Comentarios  ·  Fuente: mrdoob/three.js

Se agregó soporte inicial para texturas .basis en https://github.com/mrdoob/three.js/pull/16522. Este problema rastrea la limpieza restante y las mejoras planificadas. No estoy trabajando en esto todavía, y actualizaré este problema cuando comience, por lo que los RP son bienvenidos mientras tanto:

  • [x] Limpiar TODO restantes en el código
  • [x] Aplicar correcciones de eslint
  • [x] Agregar documentación
  • [x] Agregar ejemplo
  • [x] Agregar setMaxWorkers() método
  • [x] Admite mapas MIP
  • [] Se corrigió la compatibilidad con mipmap en iOS
  • [] Vuelva a compilar el transcodificador básico con bootstrapping sugerido por @austinEng
  • [] Devuelve la textura sincrónicamente desde load() (¿sin alfa?)
  • [] Soporte alfa
  • [] Admite formato de salida de transcodificación configurable por el usuario
  • [x] Agregar módulo ES
Enhancement Loaders

Comentario más útil

Esta solución (en el trabajador justo antes de llamar a transcode) parece funcionar para mí. Esto debe corregirse en el transcodificador, por supuesto, pero es fácil de validar esto en 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 );

Todos 60 comentarios

No he examinado el código en detalle todavía, pero ¿podríamos devolver sincrónicamente texture de load como lo hacen otros cargadores de texturas?

Creo que es bueno para la consistencia. Y si no devolvemos la textura sincrónicamente, el usuario debe llamar a material.needsUpdate = true en la devolución de llamada (si ya se inició el bucle de animación).

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

No he comprobado todavía para confirmar que funciona con THREE.CompressedTexture , pero si es así, estoy de acuerdo en que sería mejor. 👍

Otra limpieza: las propiedades asignadas a la textura son un poco arbitrarias (sobrantes de la demostración básica), como flipY=false . Y hay una variable startTime no utilizada en el trabajador.

Si estoy en lo cierto, mipmaps no parece ser compatible. ¿Transcoder no es compatible? ¿O loader aún no ha implementado la compatibilidad con mipmaps?

Un archivo .basis puede contener múltiples niveles de mapa mip, sí. Creo que el transcodificador ya lo admite, pero no lo he probado. BasisTextureLoader aún no lo admite.

También deberíamos actualizar a la versión nueva / más pequeña del transcodificador: https://github.com/BinomialLLC/basis_universal/pull/7~~ Hecho.

Sí, el transcodificador debería admitirlo. Pasa el nivel mip como levelIndex a transcodeImage .
https://github.com/BinomialLLC/basis_universal/blob/master/webgl/transcoder/basis_wrappers.cpp#L197

Gracias por tus explicaciones.

Y si hay otras funcionalidades que el cargador aún no admite, pero el transcodificador sí lo sabe, agréguelo a la lista TODO. Podemos ayudar a la implementación.

Hizo un ejemplo. # 16553 Puede ser demasiado simple, no dude en mejorar / reemplazar más tarde si está combinado.

En otras funciones que tiene el transcodificador, pero THREE.BasisTextureLoader no, una diferencia clave es que el transcodificador puede generar muchos formatos adicionales:

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

Honestamente, no sé cuándo usar todos estos. Espero que el usuario a veces quiera controlar eso y, en otros casos, un cargador (por ejemplo, GLTFLoader) tomará la decisión en función del propósito de la textura. Por ejemplo, podría elegir un formato comprimido diferente para material.map (color base) que para material.aoMap (oclusión ambiental).

La forma más obvia de respaldar esto sería agregar una alternativa a detectSupport( renderer ) :

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

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

Esto tiene un problema potencial: si estoy cargando varias texturas, es posible que no queramos transcodificarlas todas al mismo formato. Podríamos crear varios cargadores, pero luego es más difícil reutilizar los Web Workers existentes (lo cual es importante). Podríamos pasar un formato al método load() , pero entonces no es compatible con TextureLoader. Supongo que lo mejor podría ser asegurarse de que al hacer esto ...

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' );

... siempre aplicará el formato correcto a cada textura, aunque la decodificación sea asincrónica.

Otra nota, solo para mantener esto en alguna parte: el contenedor JS en examples/js/libs/basis contiene un cambio menor de la versión en el repositorio de Basis. La primera declaración ( var Module ) se reemplaza con solo Module para habilitar la inicialización diferida utilizada en un Web Worker. Esto probablemente se puede hacer de manera diferente, ya sea compilando el transcodificador con diferentes indicadores o mediante https://github.com/BinomialLLC/basis_universal/issues/21.

¿Debería BasisTextureLoader funcionar en conjunto con glTF? Intenté codificar texturas manualmente en formato .basis y agregar BasisTextureLoader como un cargador como este:

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

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

Pero las texturas no se renderizan correctamente y la consola tiene el siguiente resultado:

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

mismo problema que @zeux describe

Depuré esto y esto sucede porque:

  1. El cargador glTF generalmente establece el filtrado magnético en LinearMipMapLinearFilter
  2. BasisTextureLoader no es compatible con mipmaps
  3. webGL requiere que las cadenas mip estén completas: - /

@zeux No admitido oficialmente: la especificación glTF principal solo permite texturas JPEG y PNG. Pero una extensión para Basis (a través de la envoltura KTX2) es el mecanismo por el cual planeamos agregar soporte de textura comprimida al formato. Consulte https://github.com/KhronosGroup/glTF/pull/1612 para ver las extensiones de borrador (solo las dos primeras son relevantes aquí) y no dude en agregar comentarios.

Dicho esto, la falta de compatibilidad con mipmap en BasisTextureLoader se debe simplemente a que aún no hemos llegado a ella. El transcodificador en sí debería admitir eso, hasta donde yo sé.

PR enviado para arreglar el soporte de mipmap - con esto siempre que convierta texturas con la opción -mipmap , el cargador glTF solo funciona siempre que agregue el cargador como se indica arriba, al menos en el escritorio. No pude hacer que se ejecutara en un dispositivo móvil (iPhone o Android), pero el ejemplo de threejs.org con el cubo giratorio tampoco funciona en el iPhone, por lo que podría ser un problema separado.

No pude ejecutarlo en un dispositivo móvil (iPhone o Android)

De los documentos de Basis -

Por ejemplo, en iOS, solo puede usar potencia cuadrada de 2 dimensiones de textura para PVRTC1, y no hay nada que Basis pueda hacer por usted hoy que solucione esta limitación. (Pronto admitiremos la capacidad de transcodificar texturas más pequeñas que no sean pow2 en una potencia mayor de 2 texturas PVRTC1).

Hemos utilizado una textura de 512x768 en esta demostración y probablemente deberíamos reemplazarla con algo que se ajuste a esa restricción.

Ok, eso tiene sentido. FWIW, el teléfono Android en el que estaba probando tiene una gran cantidad de problemas con varias demostraciones de WebGL, no solo relacionadas con la textura básica: un teléfono Android diferente funciona bien. Entonces, sí, probablemente sea solo la restricción del poder de dos lo que es problemático en iOS.

Varias actualizaciones de BasisTextureLoader vienen en https://github.com/mrdoob/three.js/pull/16675.

Probablemente también deberíamos pensar en cómo admitir alpha ... la documentación de Basis entra en algunos detalles sobre las opciones (https://github.com/BinomialLLC/basis_universal/#how-to-use-the-system) pero para algunos dispositivos esto implica múltiples salidas de transcodificación:

Dispositivos / API solo ETC1: transcodifique a dos texturas ETC1 y muestrelas en un sombreador. Puede usar una textura ETC1 que sea el doble de alta o dos texturas ETC1 separadas.

Hasta ahora, la API coincide con TextureLoader , que debería cambiar (o tener una API alternativa) para admitir la devolución de múltiples salidas transcodificadas desde una única textura .basis .

El cambio a una textura cuadrada de potencia de dos en https://github.com/mrdoob/three.js/pull/16686 corrige la demostración en iOS, pero los mapas mipmaps no funcionan:

INVALID_VALUE: compressedTexImage2D: la longitud de ArrayBufferView no es correcta para las dimensiones.

¿Necesitamos hacer algo en particular para mipmaps con PVRTC?

¿Eso está sucediendo en uno de los últimos mips?

No depuré lo suficiente para identificar qué mips, pero el error se imprime tres veces y los tres últimos tenían el mismo tamaño de búfer. 🤔

Sospecho que Basis no calcula el tamaño (en bytes) de los últimos mips correctamente. Para PVRTC1 4bpp, las dimensiones de los bloques se redondean a 8, por lo que 4x4, 2x2 y 1x1 deben tener el mismo tamaño que 8x8. Creo que el transcodificador Basis se redondea a 4x4. Todas las imágenes de tamaños 8x8, 4x4, 2x2, 1x1 deben ocupar 32 bytes; Creo que para 4x4 y por debajo de Basis asume que es solo 1 bloque 4x4 que tiene 8 bytes y le da 8 bytes en lugar de 32. @ richgel999

La fórmula para calcular el tamaño de las imágenes está aquí: 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

Esta solución (en el trabajador justo antes de llamar a transcode) parece funcionar para mí. Esto debe corregirse en el transcodificador, por supuesto, pero es fácil de validar esto en 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 );

¡Gracias! Arreglaré esto lo antes posible.

El error de tamaño del mapa mip de PVRTC1 debería corregirse. Arreglamos el transcodificador para que borre los bytes adicionales en mips pequeños (de menos de 8 píxeles de ancho / alto). Y arreglamos la envoltura para devolver los tamaños correctos. Por favor, avíseme si hay algún problema y lo solucionaré lo antes posible.

@donmccurdy ¿Podría agregar " texture del método load " a la lista de tareas pendientes? (como takahirox sugirió arriba)

@ Ben-Mack agregó. Tenga en cuenta que debido a que las texturas con un canal alfa pueden transcodificarse a múltiples texturas, y no lo sabremos de forma sincrónica, necesitaremos una API diferente para ello.

@ richgel999 ¡ Gracias! Tengo problemas para reconstruir el transcodificador WASM, ya que https://github.com/BinomialLLC/basis_universal/commit/ab722fa2e18536f9a1d5f33814f3088232446d52 solo se actualizó webgl/transcoder/basis_wrappers.cpp . Compilando en 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

En teoría, deberíamos poder actualizar el transcodificador y reemplazar la textura actual PavingStones.basis con esta, que incluye mipmaps:

PavingStones.basis.zip

EDITAR: Vaya, esto podría estar relacionado con https://github.com/BinomialLLC/basis_universal/pull/27.

@donmccurdy Creo que esto requiere la fusión de https://github.com/BinomialLLC/basis_universal/pull/27 , espero que esto pueda suceder pronto. Además, su versión de emscripten puede ser anterior a la existencia de emmalloc, los archivos que actualmente forman parte de three.js se crearon con 1.38.31, creo.

Este error ocurrió mientras intento cargar varios archivos base al mismo tiempo:

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

Para reproducir, simplemente llame al método load 2 veces como:

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

@ Ben-Mack Probablemente aún valga la pena corregirlo, pero ese error se debe solo a que está cargando exactamente la misma textura dos veces y el cargador reutiliza un ArrayBuffer que no se puede transferir a dos trabajadores al mismo tiempo. El siguiente código se ejecuta, a expensas de hacer el doble de trabajo:

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

@donmccurdy Para el apoyo de alpha, ¿qué pasa con algo como:

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

También se podría agregar una opción para admitir alfa en el modelo de mipmap:
loader.generateAlpha = true //default

@ Makio64 ¡ Algo así! La mayoría de los cargadores de threejs no tienen estado (un solo cargador podría estar trabajando en varias cosas en paralelo), así que tal vez:

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

^ En ambos casos, pero especialmente alfa, creo que puede haber suficientes formas diferentes de hacer las cosas como para requerir alguna configuración en el método.

O simplemente podríamos ser asíncronos en los nuevos métodos, en su lugar:

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

La solución asíncrona parece más fácil de implementar con el trabajador y se alinea con los otros cargadores de threejs.

Solo puedo cargar texturas con resolución 768 por 512 o 384 por 256, etc., cualquier otra resolución no se carga con Three.js y BasisTextureLoader con advertencia:
"La textura unida a la unidad de textura 0 no se puede renderizar. Puede que no sea potencia de 2 y tenga un filtrado de textura incompatible".

@ mozg4D , consulte la documentación básica , en particular, se requieren texturas de potencia de dos en iOS. Si la documentación no coincide con el comportamiento que está viendo, presente un nuevo error. También es posible que el filtrado de texturas seleccionado sea incompatible, en cuyo caso aún necesitaríamos una demostración y sería útil un nuevo error. ¡Gracias!

@donmccurdy ¿Se lanzará pronto el soporte alfa de Basis?

Creo que encontré un error: solo en iOS, hay un extraño efecto de "textura brillante" en los bordes de textura-geometría: # 17597

¿Alguien más se ha encontrado con esto?

Creo que en iOS probablemente usará PVRTC. ¿Sucede esto en una versión anterior (r108)?
¿Quizás podrías intentar presentar un problema en https://github.com/BinomialLLC/basis_universal?

¿Sucede esto en una versión anterior (r108)?

El error que presenté es para r108.

¿Quizás podrías intentar presentar un problema en https://github.com/BinomialLLC/basis_universal?

Estaba en el proceso de hacerlo: https://github.com/BinomialLLC/basis_universal/issues/78

Creo que encontré un error: solo en iOS, hay un extraño efecto de "textura brillante" en los bordes de textura-geometría: # 17597

Respondí en base_universal github. Tomaremos la textura y veremos qué está sucediendo. Lo más probable es que sea un artefacto relacionado con no configurar correctamente el indicador de transcodificación de direccionamiento de ajuste / sujeción, o un artefacto causado por nuestro codificador PVRTC1 en tiempo real. Si cualquiera de los dos es el problema, normalmente existen soluciones. También podemos aumentar la calidad de PVRTC1, a costa de más tiempo / memoria de CPU de transcodificación.

Publiqué una actualización en https://github.com/BinomialLLC/basis_universal/issues/78#issuecomment -536159690; capturas de pantalla incluidas allí.

Muestra el problema de envoltura con un cubo que no gira.

Encontré otro error (pero probablemente no relacionado): https://github.com/mrdoob/three.js/pull/17546#commitcomment -35275564

Encontré otro error (pero probablemente no relacionado): # 17546 (comentario)

Corregido en # 17622.

En términos de mipmaps, ¿hay alguna manera de cargar correctamente los archivos de textura base (referenciados dentro de un archivo .gltf) sin tener que incrustar los mipmaps en el archivo .basis?

Puedo hacer que se cargue proplery cuando genero el archivo .basis con -mipmap , sin embargo, esto agrega mucho al archivo .basis, pero cuando genero un archivo .basis sin -mipmap opción, simplemente se muestra en negro en el navegador con threejs.

En términos de mipmaps, ¿hay alguna manera de cargar correctamente los archivos de textura base (referenciados dentro de un archivo .gltf) sin tener que incrustar los mipmaps en el archivo .basis?

Puedo hacer que se cargue proplery cuando genero el archivo .basis con -mipmap , sin embargo, esto agrega mucho al archivo .basis, pero cuando genero un archivo .basis sin -mipmap opción, simplemente se muestra en negro en el navegador con threejs.

Por ahora, puede deshabilitar mipmaps para que se muestre la textura:
https://discourse.threejs.org/t/compressed-texture-workflow-gltf-basis/10039/12?u=johannesdeml
https://github.com/JohannesDeml/three.js/commit/909d9cc6dc9192f398df7455f52b7e71e3bf61e2

Eso, por supuesto, no es compatible con mipmaps, pero si su objetivo es solo mostrar texturas, esa podría ser una solución fácil para usted.

Parece que ya no funciona, y parece que BasisTextureLoader ahora también tiene un código similar (configurando min / magFilter = LinearFilter) cuando solo se detecta 1 mipmap (https://github.com/mrdoob/three.js /blob/e66e86901abd84ffc260fea9665170631a2b0493/examples/js/loaders/BasisTextureLoader.js#L170-L171) - que es lo que genera basisu sin la opción -mipmap . Sin embargo, sigue siendo negro.

¿Puedes compartir el archivo? Estaba haciendo esto tan recientemente como la semana pasada, aunque era la Base en un contenedor .ktx2 lugar de .basis ...

Y solo para confirmar, ¿sabe que no puede generar estos mapas MIP en tiempo de ejecución y tendría que conformarse con las restricciones de interpolación involucradas?

¡Claro, y gracias por echarle un vistazo!

body_green.basis.zip

Y solo para confirmar, ¿sabe que no puede generar estos mapas MIP en tiempo de ejecución y tendría que conformarse con las restricciones de interpolación involucradas?

Sí, me di cuenta de eso también, es una pena, ya que gran parte de la ganancia que vi en un archivo .basis más bajo en comparación con un jpg comprimido se pierde; sé que la ganancia de memoria de la GPU todavía está allí, pero en su mayoría estaba centrado en el tamaño de descarga / transferencia de la textura.

Y solo para confirmar, ¿sabe que no puede generar estos mapas MIP en tiempo de ejecución y tendría que conformarse con las restricciones de interpolación involucradas?

¿Es este siempre el caso cuando se usa base en lugar de jpg / png?

¿Qué tal un caso de uso de empaquetar 6 texturas como facelist para un mapa de cubos en un archivo de base única ya que el formato lo admite / menciona en el README? ¿El generador PMREM es inútil aquí y el archivo base debería tener mapas MIP para cada textura generada?

¿Qué hay de proporcionar estos datos de textura empaquetados para usarlos como un mapa de cubos en ThreeJS? ¿Normalmente pasarías argumentos para cada textura individual? (Todavía no he investigado el soporte de este cargador de texturas para ver si es posible un archivo base con múltiples texturas) ¿Una alternativa tal vez sea a través de KTX2, que podría ser más adecuada para proporcionar un archivo base empaquetado de facelist que se usará como un mapa de cubos?

Una última pregunta sobre este uso mientras discutía el manejo de alfa, estas texturas podrían codificarse como RGBE o RGBM (ThreeJS es compatible con M7 y M16). No he investigado qué tan bien se comprimen con base, pero pueden tener problemas similares a los que se conocen con los mapas normales. Es bastante importante que los datos del canal alfa se hayan admitido allí, no estoy seguro de a qué formato de textura comprimida se transcodificarán, algunos pueden producir resultados bastante pobres, como se indica en el artículo vinculado a continuación.

ARM escribió un artículo sobre problemas con ASTC y RGBM, por ejemplo . El motor de Unity, como menciona el artículo, usa RGBM5, que en la mayoría de los casos debería cubrir un rango HDR adecuado, el multiplicador más bajo presumiblemente produciría menos problemas de calidad de compresión que una constante de multiplicador más alta si los datos se ajustan a los límites del rango.

Lo siento, no sé la respuesta a estas preguntas. Es posible que tenga más suerte con los repositorios Basis Universal o KTX GitHub. Sé que KTX2 está diseñado para admitir mapas de cubos con cargas útiles de Basis.

Los mencioné aquí porque parecían casos relevantes para el uso del soporte de ThreeJS que se discutirán aquí.

Basis puede almacenar las 6 texturas de un mapa de cubos en un solo archivo de base. KTX2 con soporte Basis puede ofrecer un mejor soporte de cubemaps con múltiples texturas pero con un solo archivo afaik.

No está claro que ThreeJS pueda manejarlo en el futuro. Quizás sea necesario proporcionar 6 archivos de base diferentes, o ganar KTX2 con soporte de cargador de base.

RGBM5 necesitaría un PR separado, solo RGBM7 o RGBM16 que existen actualmente, o una variante que toma un uniforme para ajustar el valor del multiplicador. La parte principal importante es que el alfa debe manejarse adecuadamente para comprimir correctamente, por lo que poder tener cierto control sobre eso, como se discutió anteriormente en este número, es otro ejemplo de dónde sería útil, similar a los mapas normales y sus mapas lineales / codificación sin color, que también puede tener el formato dividido en dos posibles texturas (desde RGB de un solo color para X y alfa para Y en el archivo base) según el soporte de compresión.

Three.js actualmente es compatible con Basis Universal. Hace unas semanas se lanzó un nuevo formato básico, UASTC. No creo que Basis admitiera cubemaps en un solo archivo antes de eso. Las solicitudes de extracción serán bienvenidas.

Un cargador KTX2 está en progreso, con https://github.com/mrdoob/three.js/pull/18490.

Las versiones anteriores de README for Basis (anteriores a UASTC, pero aún presentes en el archivo README actual) muestran una mención del empaquetado de texturas múltiples en la función de archivo de una sola base:

Los archivos base admiten matrices de texturas no uniformes, por lo que los mapas de cubos, las texturas de volumen, las matrices de texturas, los niveles de mipmap, las secuencias de vídeo o los "mosaicos" de texturas arbitrarias se pueden almacenar en un solo archivo. El compresor es capaz de explotar las correlaciones de colores y patrones en todo el archivo, por lo que varias imágenes con mipmaps se pueden almacenar de manera muy eficiente en un solo archivo.

Las solicitudes de extracción serán bienvenidas.

No sabría por dónde empezar, ni tengo tiempo libre en este momento. Quizás una vez que este problema progrese hasta su finalización y el cargador KTX2 esté listo, se pueda abordar la compatibilidad con mapas de cubos comprimidos / empaquetados. Si tengo tiempo libre para entonces, estaría feliz de intentar contribuir con un PR :)

Hola a todos, tengo un problema intermitente en iOS (¡aawww maaaan!)
Básicamente, la textura a veces se carga bien, a veces no aparece.
No hay error en la consola, el progreso de la carga es del 100%, por lo que definitivamente no es un problema de red.
Probado tanto en el ejemplo oficial (https://threejs.org/examples/?q=basis#webgl_loader_texture_basis) como en mi propio proyecto. En mi iPhone X, en Safari, la textura a veces aparece y otras no.
En el iPhone 6, Safari, nunca aparece.
Todos los demás se ven bien.
¿Qué podría ser?

[EDITAR] acaba de tener el mismo problema en Safari en Mac OS, todavía intermitente

@igghera Parece que esto puede ser un error, especialmente si está sucediendo en el ejemplo oficial. ¿Te importaría abrir un nuevo número para esto? ¡Gracias!

¿Cómo se puede agregar soporte para texturas de matriz 2D en BasisTextureLoader ? Investigué un poco esto, pero no estoy seguro de cómo proceder.

Cambiar la función transcode para recorrer las imágenes del recuento devuelto por basisFile.getNumImages() parece sencillo, pero parece que hay tres cosas que abordar después de eso:

  1. compressedTexImage3D no existe en THREE.WebGLState y necesitaría pasar una opción por gl.TEXTURE_2D_ARRAY por WebGLRenderingContext.compressedTexImage3D
  2. La API de Basis devuelve mipmaps individuales por índice de imagen, pero necesita un solo blob de textura grande para enlazar por sampler2DArray ?
  3. CompressedTexture necesitaría una forma de asociar mipmaps por índice de imagen. Para una imagen de matriz profunda de 200 y 6 niveles de mapa mip, eso serían 1200 entradas de mapa mip, por lo que probablemente mipmaps en CompressedTexture convierta en una matriz escalonada. ¿O hay alguna forma en que WebGL abstrae ese detalle?

Luego, para las texturas de video, probablemente necesitaría una implementación diferente. En lugar de transcodificar por lotes a la vez, mantendría abierto el identificador del archivo base y tendría alguna forma de solicitar el siguiente fotograma.

¿Fue útil esta página
0 / 5 - 0 calificaciones