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。哦,你说得对。我明白了,
中的只是为了复制。延迟也可能是因为这是一个同步函数。尽管如此,这一点的含义对我来说还是有点模糊。您必须等待渲染完成,那里发生的某些事情可能会减慢速度。