2016-06-03 3 views
1

При попытке сохранить изображение из three.js WebGL делают это выходит совершенно пустой, но она возвращает тонны символов:Three.js toDataUrl пустой

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

У меня есть набор preserveDrawingBuffer истина, как так:

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

CanvasCode

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

Честно говоря, я не уверен, что еще сказать, кроме, какие-либо идеи относительно того, почему изображение подходит как совершенно пустой? Функция render() - это последняя вещь в нижней части кода.

+0

Я до сих пор не могу получить его, чтобы сделать изображение, я гугл вокруг и пытался несколько различных способы сделать это, все еще все пути делают пустой образ. –

ответ

0

WebGL - это асинхронный API. Таким образом, вам нужно либо добавить gl.finish() (который может ухудшить производительность), прежде чем звонить toDataUrl() или вызвать его на следующем кадре. Для этого вам, например, можно использовать setTimeout (у Вас есть что, но делать это неправильно):

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

Я просто попробовал это, он просто говорит, что gl, webgl и т. Д. Не определены. Я также попробовал THREE.finish(), и это тоже не сработало. –

+0

@brandoncox try комплектTimeout. Я отредактировал ответ, чтобы включить фрагмент кода. –

+0

Я получаю эту ошибку: [.CommandBufferContext.Offscreen-MainThread-038CA608] RENDER ПРЕДУПРЕЖДЕНИЕ: нет текстуры, привязанной к устройству 0 –

Смежные вопросы