Direct3D9とVMR9は実は仲が悪い?

ということで、今日のネタです。これ以上考えたくないのでネタにします。

DirectShowを使ってDirect3D9のテクスチャに描画するにはだいたいどちらかを使います。

  • CBaseVideoRendererを使って、一度サーフェイスデータをして受け取ったデータをテクスチャに転送
  • VMR9を使って直接テクスチャに描画させる

なんですが、その後者を使ったときの問題点です。

VMR9のRenderlessサンプルでは、VMR9がテクスチャに描画したタイミングで画面へのPresentを行っています。

ところが、だいたいのゲームなどのアプリケーションではDirect3D9の描画とVMR9の描画を非同期でやりたいところですが、これが出来ないんですね~。

VMR9がテクスチャとして描画するときには、じつは3DRenderTargetとして、一度Direct3D9のレンダリングターゲットを一時的に乗っ取らないとだめらしいのです。

この動作があるため、Direct3D9側の描画を行うときには必ずVMR9の描画が完了した直後でないと、3D側のレンダリングターゲットが描画開始状態で正しいかどうかが誰も保証してくれないわけですね~。

さらにいうなら、VMR9の動作は、Direct3D9側(本体側)の動作とは完全に非同期なのでレンダリングターゲット設定のタイミングをDirect3D9側で知ることが出来ないという問題が。

こんなことで半日つぶした自分も自分ですが・・・。

組んだときに気がつかなかったのは、そのときのデバッグで使っていたグラボがその機能に対応していなかったのでその現象が発生しなかったんですね~。

ま、謎が解ければやりようはあります。解消するか放置するかは後で考えます・・・。

はぁ・・・


コメントを残す

メールアドレスが公開されることはありません。

*

この記事のトラックバック用URL