Estoy importando un modelo glTF que contiene un conjunto UV, y quiero asignarle una textura dinámicamente en ThreeJS inyectando código de sombreado en el existente usando onBeforeCompile() .
Hasta ahora todo funciona, sin embargo, si elimino la textura de prueba del modelo en Blender y la vuelvo a exportar, el sombreador se niega a compilar con un error vUv undeclared identifier . Al ver los atributos del búfer de geometría en la consola de depuración, los mapas UV parecen estar definidos, pero no se definen en el sombreador por algún motivo.
No quiero exportar el modelo con una textura, eso significaría cargar la textura dos veces (una cuando se cargó el modelo, una vez cuando la textura se carga dinámicamente).
¿Alguien sabe cómo evitar esto?
los mapas UV parecen estar definidos, pero no se definen en el shader por alguna razón.
Eso sucede porque los materiales incorporados solo definen la variación de vUv si los mapas se muestrean en el sombreador de fragmentos. Dado que ha eliminado todos los mapas de su activo, no se define ninguna variación.
Una solución para resolver el problema es definir la variación manualmente a través onBeforeCompile() sobrescribiendo el fragmento del sombreador uv_pars_fragment con solo varying vec2 vUv; .
Después de un poco de excavación, descubrí que solo puedo configurar
material.defines.USE_UV = '';Y habilitará los UV para el modelo.