Pipetノードをダミーの動画テクスチャ出力先として使う
前回の投稿からまた間隔が空いてしまいました、お久しぶりです。 大学では卒研発表も終わり、まだ卒論の訂正が大量に残ってはいますが、ひと段落ついて安心しています。
なので久しぶりにVVVVでVJ環境を書こうとしたのですが、その際に動画テクスチャ周りで問題が発生したので、 見つけた解決法などをまとめました。
動作環境
Lenovo ThinkStation E30
DX11でVideoTextureを扱う
そもそもは、FileStream (DShow9)とVideoTexture (EX9.Texture VMR9)を使って生成したDX9の動画テクスチャを、 一度Renderer (DX9)を経由させ、DX11に変換して使うパッチを書いていました。 addonsパックのDX9ToDX11と処理内容は同じです。
・・・このような記事をわざわざ書くということは、これではなぜか動画が再生されないということです。
確かに再生「状態」にはあるものの、Renderer (DX11)に動画が表示されません。 ここで試しに、Renderer (DX9)を隠し状態から埋め込み表示に変更します。
動きます。何故なんでしょうか、わかりません・・・。 さらにこの後、再びRenderer (DX9)を隠し状態にすると、何故かFileStream (DShow9)での再生ポジションが0に戻されて再生が始まり、なぜかRenderer (DX11)に動画が表示されるものの、とてもカクついており使えたものではありません。
VideoTextureの癖?
今回はDX9からDX11へ動画テクスチャを変換する際に発生した問題を具体例として取り上げましたが、他にもVideoTexutureの特性(?)が原因の予期しない挙動があります。
続いて以下の様に、Switch (Node Output)で入力テクスチャの行き先を分離させ、それぞれに別のフィルターを経由させた後にSwitch (Node Input)でどちらかのフィルターを経由したテクスチャを選択します。なおテクスチャの描画先はRenderer (DX9)です。
これはリアルタイムで複数のフィルターを切り替えるシチュエーションを想定したものですが、なぜフィルターの手前でわざわざSwitch (Node Output)を使ってテクスチャの行き先を1つに制限しているか説明すると、VideoTextureから複数のフィルターに直接つなぐと、つながっている全てのフィルターでテクスチャの処理をしてしまい、無駄にCPUを使い他の処理を圧迫するからです(そのはずですが、もし違っていたら申し訳ありません・・・)。
そしてこの状態でフィルターを切り替えるスイッチを押すと・・・。
切り替わった瞬間に再生ポジションが0に戻されてしまいます。ホント何なん・・・。
ここからは憶測ですが、FileStream (DShow9)とVideoTexture (EX9.Texture VMR9)は、生成するテクスチャの行き先(DX9系の出力に限る)がなくなると生成を止めてしまう、もしくはマトモに生成しない、と考えています。だから1つ前の例では途中に挟んでいるRenderer (DX9)を隠し状態から表示状態に遷移させるとその先までテクスチャが行きつくようになりRenderer (DX11)で描画できるようになったり、先ほどの例ではスイッチングで一瞬テクスチャの流れが途絶えてしまい、再びFileStreamからRendererまでの道がつながったときに0秒のポジションから再生し始めたのだと思います。
DX9系では動画の流れを途絶えさせない
ということで、FileStream (DShow9)で取り込んだ動画をVideoTexture (EX9.Texture VMR9)でテクスチャとして扱い、その先何らかの方法でテクスチャの流れを途絶えさせなければ良いのです。が、どうやれば良いのやら・・・。
と思って、この記事の冒頭にも紹介したaddonsパックに含まれるDX9ToDX11の中身を見てみました。
Pipet (EX9.Texture)というノードにコメントが付いていますが、要は「Rendererが接続されてなかったり隠し状態でも、テクスチャを吸ってくれるよ。」との事です。
・・・マジか。てか、DX9ToDX11ってこんなパッチングだったっけと思ったら、つい最近addonsパックが更新されていたようで、このノードもPipet (EX9.Texture)を追加していたようです。
このPipet (EX9.Texture)というノードは、ピペットの名前らしくお絵かきソフトのように、テクスチャ中の指定したピクセルの色を抜き出す処理をしてくれますが、どうやらこのノードは動画テクスチャのダミーの行き先として使うことで、他の道が途絶えてもおかしな挙動を防止することを実現できそうです。
まとめ
VideoTexture (EX9.Texture VMR9)のTexture OutピンにPipet(EX9.Texutre)を追加で接続するだけで、動画テクスチャの操作時におかしな挙動が起こることをどうやら防止できそう、というお話でした。実際、先ほどのスイッチングの例ではスイッチ切り替え時に動画が冒頭へシークされてしまう現象が起きませんでした。