【发布时间】:2018-10-24 17:51:17
【问题描述】:
我有一个使用四种纹理的 OBJ。文件中定义的UV范围从(0, 0)到(2, 2),其中(0.5, 0.5)指的是第一个纹理中的一个坐标,(0.5, 1.5)是第二个纹理中的一个UV坐标, (1.5, 0.5) 是第三个纹理中的坐标,(1.5, 1.5) 是最后一个纹理中的坐标。
我已经有了正确的 three.js 几何图形或对象。但是,我现在需要能够将正确的纹理贴图应用到这些对象。
在代码中:
我有一个 THREE.Mesh 具有正确的几何形状(UV 坐标为 U = [0, 2], V = [0, 2])和一个虚拟占位符材质。我目前像这样加载单个纹理:
var texture = new THREE.TextureLoader().load('tex_u1_v1.png', function() {
object.material.map = texture;
object.material.map.needsUpdate = true;
});
正如预期的那样,四分之一的网格纹理正确。我还有三个纹理文件,tex_u1_v2.png、tex_u2_v1.png 和 tex_u2_v2.png。我希望能够将这些纹理也应用于object(THREE.js 网格),这样网格中的每个有效 UV 都有一个纹理。
但是,我不知道如何在创建object 后添加多个材质。此外,我不知道如何为网格指定 tex_u1_v2.png,例如,应该用于范围内的 UV (U = [0, 2], V = [1, 2])。
【问题讨论】:
-
当您在此处发帖时,您的想法是您自己已经进行了大量研究。你都尝试了些什么?你到底卡在哪里了?问题是什么?它不应该以“如何”开头。 (另外,直接的答案是将你的 UV 坐标除以 2 并将四个图像组合成一个纹理。你尝试过吗?)
-
目前,我尝试使用具有从 0 到 1 的 UV 的模型,以及单个纹理图像。但是,我正在使用极高分辨率的纹理 (16384^2),这会导致 FPS 极低。经过各种测试后,似乎这种低 FPS 是单个大纹理的函数,而不是所有纹理中的像素总数。
-
渲染大量纹理可能有不同的方法。无论如何都没有可以渲染的屏幕,所以也许某种 LOD 系统可能值得研究。否则,这不能开箱即用。您可以尝试使用
onBeforeCompile修改您的object.material,但它很笨重。 -
我发现具有四个不同 8192^2 纹理的四个相同网格以 30-60 fps 运行,而具有 16384^2 纹理的单个网格以
-
因此,我希望如果我在单个网格上使用四个(或更多)较小的纹理,而不是单个较大的纹理,那么我可以实现更高的 FPS。现在,我试图弄清楚如何将这四个纹理分配给单个网格,以便它们使用 UV 坐标的扩展范围(即纹理 1 用于范围内的 UV(U = [0,1],V = [0, 1]),纹理 2 用于范围内的 UV(U = [1,2],V = [0, 1])等)。
标签: javascript 3d three.js textures uv-mapping