Javascript 如何在不使用Three.js在画布上实际渲染的情况下获取场景的像素数据?

Javascript 如何在不使用Three.js在画布上实际渲染的情况下获取场景的像素数据?,javascript,three.js,Javascript,Three.js,我想知道如果我要正常渲染场景,但实际上还没有在画布上渲染它们,我是否可以基本上获得画布上渲染的像素(作为数组缓冲区)。如果是,怎么做 我真的没有任何代码来做这样的事情,因为我不知道它是否可能。(我对Three.js也很陌生)几乎是的:您可以将场景渲染到一个场景中,并使用它访问渲染数据。我所知道的唯一区别是,它将没有抗锯齿 比如说: const rt = new THREE.WebGLRenderTarget(rendererWidth, rendererHeight); renderer.ren

我想知道如果我要正常渲染场景,但实际上还没有在画布上渲染它们,我是否可以基本上获得画布上渲染的像素(作为数组缓冲区)。如果是,怎么做


我真的没有任何代码来做这样的事情,因为我不知道它是否可能。(我对Three.js也很陌生)

几乎是的:您可以将场景渲染到一个场景中,并使用它访问渲染数据。我所知道的唯一区别是,它将没有抗锯齿

比如说:

const rt = new THREE.WebGLRenderTarget(rendererWidth, rendererHeight);
renderer.render(scene, camera, rt);

// w/h: width/height of the region to read
// x/y: bottom-left corner of that region
const buffer = new Uint8Array(w * h * 4);
renderer.readRenderTargetPixels(rt, x, y, w, h, buffer);
现在,如果只想渲染感兴趣的屏幕的一小部分,可以使用:


几乎是:您可以将场景渲染到渲染视图中,并使用来访问渲染数据。我所知道的唯一区别是,它将没有抗锯齿

比如说:

const rt = new THREE.WebGLRenderTarget(rendererWidth, rendererHeight);
renderer.render(scene, camera, rt);

// w/h: width/height of the region to read
// x/y: bottom-left corner of that region
const buffer = new Uint8Array(w * h * 4);
renderer.readRenderTargetPixels(rt, x, y, w, h, buffer);
现在,如果只想渲染感兴趣的屏幕的一小部分,可以使用:


我注意到,如果要使用
上下文,则需要
uint8clampedaray
readRenderTargetPixels
只接受
Uint8Array
作为目标。使用全屏帧缓冲区(使用
Uint8ClampedArray.from(buffer)
)将
Uint8Array
转换为
Uint8ClampedArray
)需要500毫秒。有什么想法吗?嗯,您不需要转换,因为底层数据格式是相同的。尝试
newuint8clampedaray(uint8Array.buffer)
创建一个新的钳制数组,共享底层的array-buffer。哦,你说得对。我明白了,
中的
只是为了复制。延迟也可能是因为这是一个同步函数。尽管如此,这一点的含义对我来说还是有点模糊。你必须等待渲染完成,那里发生了一些可能会减慢速度的事情。我注意到,如果你想使用
上下文,则需要使用
uint8clampedaray
但是
readRenderTargetPixels
只接受
Uint8Array
作为目标。使用全屏帧缓冲区(使用
Uint8ClampedArray.from(buffer)
)将
Uint8Array
转换为
Uint8ClampedArray
)需要500毫秒。有什么想法吗?嗯,您不需要转换,因为底层数据格式是相同的。尝试
newuint8clampedaray(uint8Array.buffer)
创建一个新的钳制数组,共享底层的array-buffer。哦,你说得对。我明白了,
中的
只是为了复制。延迟也可能是因为这是一个同步函数。尽管如此,这一点的含义对我来说还是有点模糊。您必须等待渲染完成,那里发生的某些事情可能会减慢速度。