如何在 three.js 中存储和稍后检索纹理?

How can I store and later retrieve Textures in three.js?

我想存储来自网络摄像头的帧,然后在 THREE.PlaneGeometry 纹理上显示这些(延迟的)帧。

我已经在 THREE.Texture 子类中封装了一个网络摄像头框架,可以将其应用于 material。现在我想缓冲这些帧并延迟它们:

**** pseudocode within tick() function ****
for (let i = 0; i < bufferedFrames.length - 1; i++) {
  bufferedFrames[i] = bufferedFrames[i+1];
}
bufferedFrames[bufferedFrames.length - 1] = currentWebCamTexture;

// Now display delayed texture.
plane.material.map = bufferedFrames[0]; // Use a frame from the past.
plane.material.map.needsUpdate = true;

renderer.render(scene, camera)

遗憾的是,它似乎无法存储旧帧。甚至 THREE.Texture 的 clone() 方法也声明克隆不会创建图像的“深拷贝”。因此,我并没有真正缓冲一系列独特的帧。

目前,如果我使用 WebGLRenderTargets,我可以解决这个问题,即保留一个 WebGLRenderTargets 数组并渲染一个只包含我居中的网络摄像头帧的场景。仅仅为了恢复纹理而重新渲染场景似乎很浪费。这是正确的做法吗?有更清洁的方法吗?

RenderTargets 是存储 procedurally-generated 纹理供以后使用的唯一方法。从技术上讲,您可以将其复制到 2D canvas,并将其存储在其他地方,但是如果您想以 60FPS 的速度连续读取颜色数据,用这种方法从 WebGL 读取颜色数据非常缓慢且效率低下。

您不需要渲染整个场景。由于您只想复制帧而不进行任何 3D 变换,因此您可以直接使用 a very basic camera:

渲染一个简单的平面网格
// Build a plane mesh
const planeGeom = new THREE.PlaneGeometry(2, 2);
const planeMat = new THREE.MeshBasicMaterial({map: yourTexture});
const simplePlane = new THREE.Mesh(planeGeom, planeMat);

// Create simplest camera
const simpleCam = new THREE.Camera();

// Save texture to your renderTarget
renderer.setRenderTarget(yourRenderTarget);
renderer.render(simplePlane, simpleCam);