【发布时间】:2019-12-17 00:08:37
【问题描述】:
我正在尝试从 ThreeJS 中的 Texturepacker 加载 spritesheets,其中包含图像和 json。图像有一堆小精灵打包在一起,json 定义了图像中小精灵的位置和大小。
我尝试了 3 种加载方法。
- 对 json 和图像使用 ThreeJS 加载器,并分配具有不同重复和偏移值的新纹理。
- 使用 WebGLRenderTarget 缓冲区将源图像裁剪为
- 使用 Canvas 缓冲区将源图像裁剪为
使用具有不同偏移量的多个纹理实例的方法应该可以正常工作,因为我没有复制源图像,但是当我通过切换材质的纹理来运行动画时,它使用了大量的 RAM,就好像它正在复制整个源图像一样spritesheet 到内存中的每一个。如果我更改动画的纹理偏移而不是使用纹理副本,它可以正常工作,但偏移更改将应用到使用相同源 spritesheet 的每个对象。
WebGLRenderTarget 方法需要用于裁剪纹理的相机和场景以及添加到场景中的精灵。此输出无法使用,因为它不会生成原始纹理的 1:1 裁剪,而且加载速度非常慢。有没有办法在 ThreeJS 中将纹理 1:1 渲染到更小的缓冲区?
Canvas 方法在我为每个精灵创建一个画布元素并将 spritesheet 裁剪到每个元素时效果最佳。这是 1:1 并且质量很好,但使用 spritesheet 的要点是 GPU 只需要处理一个图像,这需要一个 HTML 加载器进程。理想情况下,我不想将 spritesheet 裁剪为更小的纹理缓冲区。
为什么使用具有多个 THREE.Texture 对象的同一个大型源图像会占用这么多内存?我预计它只需要在内存中保留一个纹理,Texture 对象只会显示具有不同偏移量的相同纹理。
【问题讨论】:
-
以下页面上似乎已经注意到了这个问题,并提供了一些建议的解决方法:github.com/mrdoob/three.js/issues/5821stackoverflow.com/questions/25514730/…我无法在最新版本的 ThreeJS 中使用这些解决方法。