« DirectShowで実験-サンプルのビルド | メイン | IRC チャンネル? »

2004年07月29日

吉里吉里2/KAG3ムービー拡張日誌:: DirectShowで実験-サンプルの改造

    

Texture3Dサンプルとヘルプでしばらく格闘したところ、DirectShowはDoRenderSampleを勝手に呼び出すようだ。(CTextureRendererはCBaseRendererを継承しているので)
そして、CTextureRenderer::DoRenderSampleではテクスチャをロックしてビデオの画像をテクスチャへコピーしている。
つまり、テクスチャをバックバッファにコピーするようにすれば、とりあえず目的は達成できそうだ。
とりあえず、あんまり何も考えずにIDirect3DTexture8*をIDirect3DSurface8*にキャストして、CopyRectsでコピー。
エラー。
当たり前か。
次にLockRectでちまちまコピーすることにする。
試してみると、バックバッファのサーフェイスがロックできない。
BeginScene - EndSceneの中でやっても、外でやってもできない。
if( pBackBuffer->LockRect( &lrDest, NULL, D3DLOCK_NOSYSLOCK ) == D3D_OK ) ってやっても if( pBackBuffer->LockRect( &lrDest, NULL, 0) == D3D_OK ) ってやってもできない。
何か特殊な方法があるのだろうか?
ふと、IDirect3DSurface8::LockRectとIDirect3DTexture8::LockRectの引数が違うことが気になる。
IDirect3DTexture8はテクスチャのレベルを指定するパラメタが多い。
そして、IDirect3DTexture8::GetSurfaceLevelというメソッドに気付く。
IDirect3DTexture8::GetSurfaceLevelを使えば、、IDirect3DSurface8*が得られるようだ。
早速、取得してCopyRectsを試す。
エラー。
フォーマットが違うとでている。
バックバッファーはD3DFMT_X8R8G8B8だが、テクスチャはD3DFMT_A8R8G8B8。
面倒なのでテクスチャをD3DFMT_X8R8G8B8にしてしまう。
で、実行。
うまく表示されたが、上下逆だ。
DoRenderSampleの引数のIMediaSampleからGetPointerを使って得られるポインタはビットマップ形式のようだ。(つまり上下逆)
反転させるためにIMediaSample::GetMediaTypeを使って、サイズを得ようといろいろやるが、画像サイズは元々メンバにあった。
m_lVidHeightやm_lVidPitchを使えばよいようだ。
で、ビットマップの方を下からコピーするようにして反転させる。
表示させてみると・・・うまく表示された。
とりあえず、こんなもんかな。
謎がいくつかあるが気にしない。
バックバッファがロックできないのは結構気になるが。
でも、それよりもう少しDirectShowをさわる部分をいじっていかねば。



投稿者 Takenori : 2004年07月29日 06:25




comments powered by Disqus
Total : Today : Yesterday : なかのひと