【问题标题】:Three.js toDataUrl blank三.js toDataUrl 空白
【发布时间】:2016-06-09 08:10:57
【问题描述】:

当我尝试从 three.js WebGl 渲染中保存图像时,它完全空白,但它确实返回了大量字符:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK8AAADICAYAAACeY7GXAAADt0lEQ…IF4M2+znB4GcgWgDf7OsPhZSBbAN7s6wyHl4FsAXizrzP8AS/TAMmecuTCAAAAAElFTkSuQmCC

我确实将 preserveDrawingBuffer 设置为 true,如下所示:

 renderer = new THREE.WebGLRenderer( { 
    alpha: true,
    antialias: true,
    preserveDrawingBuffer: true
} );

这就是我调用 toDataUrl 的方式:

var getImageData = false;
function render() {

            //camera.position.x += ( mouseX - camera.position.x ) * .005;
            //camera.position.y += ( - mouseY - camera.position.y ) * .005;

            camera.lookAt( scene.position );

            renderer.render( scene, camera );
             if(getImageData == true){
                imgData = renderer.domElement.toDataURL("image/png");
                window.setTimeout(10);
                console.log(imgData);
                getImageData = false;
            }
            requestAnimationFrame(render);
        }


           getImageData = true;

这是画布在渲染为图像之前的样子:

画布

画布代码

<canvas width="175" height="200" style="width: 175px; height: 200px"></canvas>

老实说,我不知道还能说什么,除了关于为什么图像显示为完全空白的任何想法? render() 函数是代码底部的最后一件事。

【问题讨论】:

  • 我似乎仍然无法让它渲染图像,我用谷歌搜索并尝试了几种不同的方法,仍然所有方法都会生成空白图像。

标签: javascript three.js webgl getimagedata


【解决方案1】:

WebGL 是一个异步 API。因此,您需要在调用toDataUrl() 之前添加gl.finish()(这会降低性能)调用,或者在下一帧调用它。例如,您可以使用 setTimeout 来执行此操作(您可以这样做,但操作不正确):

if(getImageData == true) {
    window.setTimeout(function () {
        imgData = renderer.domElement.toDataURL("image/png");
        console.log(imgData);
    }, 100);
    getImageData = false;
}

【讨论】:

  • 我刚试过,它只是说gl,webgl等没有定义。我也试过 THREE.finish() 也没有成功。
  • @brandoncox 尝试设置超时。我已编辑答案以包含代码 sn-p。
  • 我得到这个错误:[.CommandBufferContext.Offscreen-MainThread-038CA608]RENDER WARNING: there is no texture bound to the unit 0
  • @brandoncox 你有我可以帮忙的页面吗?
  • 我将它从 100 毫秒更改为 200 毫秒,但它起作用了,我猜 100 只是不足以加载纹理。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 2016-04-23
  • 2013-05-07
  • 2012-08-13
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多