如何在 three.js 中切换 preserveDrawingBuffer?

How to toggle preserveDrawingBuffer in three.js?

基本上,我想要可以转到 preserveDrawingBuffer=true 的设置,渲染场景一次,抓取屏幕截图,然后返回。然而,这带来了两个问题:

如何正确执行此操作?

编辑:我没有找到切换它的方法,所以我不得不克隆场景并创建第二个渲染器来制作屏幕截图。参见 https://github.com/mrdoob/three.js/issues/189

您不需要 preserveDrawingBuffer: true 来截取屏幕截图。您需要的是在渲染后立即截取屏幕截图。只要您在渲染之后但在退出当前事件之前截取屏幕截图,就可以保证它有效。

例如,这将始终有效

renderer.render( scene, camera );
var screenshot = renderer.domElement.toDataURL();

而这只会在你运气好的时候随机工作

someElement.addEventListener('click', function() {
   // this is not immediately after rendering. you have no
   // idea when it is relative to rendering.
   var screenshot = renderer.domElement.toDataURL();
});

大多数 THREE.js 示例都有渲染功能,如果您需要在用户请求时截屏,您可以这样做

someElement.addEventListener('click', function() {
   render();
   var screenshot = renderer.domElement.toDataURL();
});

或者你可以这样做

var takeScreenshot;

function render() {
   ...
   if (takeScreenshot) {
     takeScreenshot = false;
     var screenshot = renderer.domElement.toDataURL();
   }
}

someElement.addEventListener('click', function() {
   takeScreenshot = true;
});

或任何其他方法来确保您在渲染后立即截取屏幕截图。

我也遇到过这个problem.my screenshot is blank in threejs webgl canvas, because not set renderer = new THREE.WebGLRenderer({canvas:renderer.domElement,preserveDrawingBuffer:true});, 这是我切换 preserveDrawingBuffer 的方法。

let canvas = this.renderer.domElement;
    canvas.getContext('webgl' , {preserveDrawingBuffer: true});
this.render();
var data = {
  image: canvas.toDataURL(),
};
canvas.getContext('webgl' , {preserveDrawingBuffer: false});