2016-10-30 2 views
0

Я использую three.js r73. У меня есть фрагмент затенение, отображение видеокадров с линией, как это:three.js: захватить видеокадр для последующего использования

gl_FragColor = texture2D(iChannel0, uv); 

Я хотел бы еще форму (скажем, iChannel1) содержать видеокадр, который был показан на более раннем этапе. (Затем я сделаю маскировку между iChannel0 и iChannel1, чтобы сделать обнаружение движения/обнаружение края и т. Д.).

Я пробовал различные подходы к этому, но не повезло.

Я полагаю, что мне нужно клонировать текстуру видео как-то в javascript, а затем назначить ее iChannel1, но я не знаю, как захватить фрейм.

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

Я посмотрел на UniformsUtils, но это тоже не похоже на трюк.

ответ

0

Я нашел способ сделать это вскоре после публикации моего вопроса. D'о.

Вот так, на будущее:

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

Обратите внимание, что необходимо iChannel1 быть инициализирован правильно для этой работы. Что-то вроде этого работает:

var pathToSubtractionTexture = 'aStillImage.jpg'; 
(new THREE.TextureLoader()).load(pathToSubtractionTexture, function (texture) { 
    that.uniforms.iChannel1.value = texture; 
}); 
Смежные вопросы