実際、これを実装するのは難しいことです。今、私はGLSLについてあまり話すことができません(私は学んでいます)が、私が知っているのは、ユニフォームは定数であり、呼び出し間で変化しないため、ケースの属性が必要になる可能性がありますが、ここで間違っていることを歓迎します. しかし、私はもっとシンプルな提案をしています。
各面に必要なすべての小さなテクスチャに「分割」できる 1 つのテクスチャを使用できます。次に、実行時にテクスチャから UV 座標を取り出して、面に個別に適用できます。計算時間は引き続き処理されますが、1000 程度の面の場合は実行可能です。25k の顔モデルでテストしたところ、ティックごとにすべての顔がすばやく変更されました。
ここでのトリックは、faceVertexUvs 3 次元配列をナビゲートすることです。しかし、たとえば 12 面のテクスチャ付き立方体の場合、次のようにすべての面を 1 つの辺に等しくなるようにリセットすることができます。
for (var uvCnt = 0; uvCnt < mesh.geometry.faceVertexUvs[0].length; uvCnt+=2 ) {
mesh.geometry.faceVertexUvs[0][uvCnt][0] = mesh.geometry.faceVertexUvs[0][2][0];
mesh.geometry.faceVertexUvs[0][uvCnt][1] = mesh.geometry.faceVertexUvs[0][2][1];
mesh.geometry.faceVertexUvs[0][uvCnt][2] = mesh.geometry.faceVertexUvs[0][2][2];
mesh.geometry.faceVertexUvs[0][uvCnt+1][0] = mesh.geometry.faceVertexUvs[0][3][0];
mesh.geometry.faceVertexUvs[0][uvCnt+1][1] = mesh.geometry.faceVertexUvs[0][3][1];
mesh.geometry.faceVertexUvs[0][uvCnt+1][2] = mesh.geometry.faceVertexUvs[0][3][2];
}
ここでは、6 色 (側面ごとに 1 つ) の立方体があり、各 faceVertexUv をループし (2 つの三角形が平面を作るので 2 ずつステップします)、すべての Uv を青色の 2 番目の側面にリセットします。もちろん、座標をある種のオブジェクトにマップして、オブジェクトを簡単に照会して、対応する Uv を返したりリセットしたりできるようにする必要がありますが、ユースケースはわかりません。完全を期すために、mesh.geometry.uvsNeedUpdate = true;
実行時に実行して更新を確認する必要があります。それが役立つことを願っています。