みかづきブログ・カスタム

基本的にはちょちょいのほいです。

Three.jsがレンダリングに使っているCanvasをdrawImageのsrcにしたり、toDataURLでbase64化したりすると真っ黒になるときの対策方法(preserveDrawingBufferをtrueにする) 🖼

Three.jsがレンダリングしているCanvasは、デフォルトでpreserveDrawingBufferがfalseになっているため、普通にdrawImageで他のCanvasにレンダリングしようとしたり、toDataURLを使ってbase64化したりしようと真っ黒になります。

developer.mozilla.org

threejs.org

const renderer = new THREE.WebGLRenderer({
  preserveDrawingBuffer: true
});

という感じで、rendererをつくるときに、preserveDrawingBufferをtrueにすれば、

renderer.domElement.toDataURL('image/png');

と、toDataURLでbase64化できますし、

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.drawImage(renderer.domElement, 0, 0);

という感じで、他のCanvasにdrawImageすることも可能になります。