Three.js имеет официальный пример выбора графического процессора, который можно увидеть здесь .
Кажется, они воспроизводят вещи в двух разных сценах и с цветами вершин.Это не плохой подход, и я не согласен с комментарием и вашим закомментированным кодом.Изменение униформы - не единственный способ добиться этого, официальный пример использует цвета вершин и объединяет все геометрии.
Есть много способов снять шкуру с этой кошки.
Вы должны во что бы то ни стало избегать создания новых материалов в тесных петлях.
Это suuuuper bad:
m.onBeforeRender = function (){
if(Renderer._renderID){
this.material = new THREE.MeshBasicMaterial(this.userData.idColor.getHex()); //just a big NO
this.material.needsUpdate = true; //no it doesnt! it's a new material it has this true by default
Для достижения чего-то подобногоили ваше собственное переопределение:
const myMesh = new Mesh()
myMesh.myMaterials = [
someRenderMaterial,
someIDMaterial,
]
scene.traverse(o=>{if(o.myMaterials) o.material = o.myMaterials[1]})
renderer.render(scene,camera)
scene.traverse(o=>{if(o.myMaterials) o.material = o.myMaterials[0]})
renderer.render(scene,camera)
Но, опять же, есть много способов сделать это.Вы можете просто сделать другую сцену и визуализировать цвета вершин.Вы можете сделать материал переопределения и визуализировать цвета вершин.Много параметров, много перестановок.