2016-10-30 17 views
0

Ich verwende three.js r73. Ich habe einen Fragment-Shader, wie dies mit einer Linie Video-Frames anzeigen:three.js: Video-Frame für die spätere Verwendung erfassen

gl_FragColor = texture2D(iChannel0, uv); 

ich eine andere Uniform möchte (sagen iChannel1), um das Video-Frame zu enthalten, die zu einem frühen Punkt angezeigt wurden. (Dann mache ich eine Maskierung zwischen iChannel0 und iChannel1 um Motion Capture/Kantenerkennung zu machen usw.).

Ich habe verschiedene Ansätze dazu versucht, aber kein Glück.

Ich stelle fest, dass ich die Videotextur irgendwie in Javascript klonen und dann iChannel1 zuweisen muss, aber ich weiß nicht, wie man einen Rahmen festhält.

Ich denke, ich konnte den Canvas-Inhalt erfassen, aber es könnte andere Geräusche auf der Leinwand geben, die ich nicht möchte. Ich möchte wirklich, dass der Videoframe nicht die Leinwand ist. Auch über Canvas Capture scheint sehr umständlich. Ich habe den Eindruck, dass mir gerade ein API-Aufruf fehlt, um den aktuellen Videoframe so aufzunehmen, dass ich eine Textur erstellen kann, die iChannel1 verwenden wird.

Ich schaute UniformsUtils, aber das scheint auch nicht den Trick zu tun.

Antwort

0

Ich fand einen Weg, dies kurz nach dem Stellen meiner Frage zu tun. D'oh. Hier

ist die Art und Weise, für die Zukunft:

if (timeToCaptureFrame) { 
    that.uniforms.iChannel1.value.image = that.uniforms.iChannel0.value.image; 
    that.uniforms.iChannel1.value.needsUpdate = true; 
} 

Beachten Sie, dass iChannel1 initialisiert werden muss korrekt für diese zu arbeiten. So etwas funktioniert:

var pathToSubtractionTexture = 'aStillImage.jpg'; 
(new THREE.TextureLoader()).load(pathToSubtractionTexture, function (texture) { 
    that.uniforms.iChannel1.value = texture; 
}); 
Verwandte Themen