【发布时间】:2023-04-08 06:08:02
【问题描述】:
我想知道如果我要正常渲染场景,但实际上不做在画布上渲染它们。如果有,怎么做?
我真的没有任何代码来做这样的事情,因为我不知道它是否可能。 (而且我对 Three.js 还是很陌生)
【问题讨论】:
标签: javascript three.js
我想知道如果我要正常渲染场景,但实际上不做在画布上渲染它们。如果有,怎么做?
我真的没有任何代码来做这样的事情,因为我不知道它是否可能。 (而且我对 Three.js 还是很陌生)
【问题讨论】:
标签: javascript three.js
几乎是的:您可以将场景渲染为THREE.WebGLRenderTarget 并使用renderer.readRenderTargetPixels() 访问渲染数据。我知道的唯一区别是它没有抗锯齿。
所以是这样的:
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);
现在,如果您只想渲染您感兴趣的屏幕的一小部分,您可以使用scissor-testing:
renderer.setScissor(x, y, w, h);
renderer.setScissorTest(true);
renderer.render(scene, camera, rt);
renderer.setScissor(0, 0, rendererWidth, rendererHeight);
renderer.setScissorTest(false);
【讨论】:
context.putImageData(outputBuffer, 0, 0),你需要一个Uint8ClampedArray,但readRenderTargetPixels 只接受Uint8Array 作为它的目标。将Uint8Array 转换为带有全屏帧缓冲区(带有Uint8ClampedArray.from(buffer))的Uint8ClampedArray 需要500 毫秒。对此有何想法?
new Uint8ClampedArray(uint8Array.buffer) 创建一个新的固定数组,共享底层数组缓冲区。
from 只是为了复制。