kumaryu日記
2010-02-08
_ 日記
えーと、前日記書いたのいつだっけ。
日曜は結局ワンフェス行かず。幕張遠いんですもの。
土日に画面取り込み受信DirectShowFilterの続きを。
PropertyPage作ったり設定した値をIPersistStreamで保存したり。
できたできた、と思ったら保存されてないなり。 どうもWindows Media EncoderさんはIPersistStreamを使ってくれないらしい。なんてことだ。
SCFH DSFなんかはどうしてんのかと思ったらレジストリに保存してた。そりゃそうか。俺もそうしよう。
さて、そんなこんなでDirectShowFilterは出来たんだけど、受信した画像はクロップはしても縮小はしていない。自分で使う限りでも1024x768なんて解像度で配信するわけにはいかないのでなんとか縮小しないと。
WMEだとそのままでも自動縮小してくれるんだけどポイントサンプリングなのでとても汚いし重いんだよね。できたらハードウェアアクセラレーション効かせて綺麗に縮小したい。
でもまあDirectShowFilter内部でいろいろやるのもつらいので送信側でやってしまいたい。ということでまずMac側を。
Macでの画面取り込みは、
- フルスクリーンのOpenGLコンテキストを作る
- テクスチャにglCopyTexImage2D
- glGetTexImageでメモリに持ってくる
が基本。
この間に縮小を挟みたい。FBOとBlitを使ってみるお。
- フルスクリーンのOpenGLコンテキストを作る
- テクスチャをアタッチしたFramebufferObjectを作る
- FBOの0番(画面)から作ったFBOにglFramebufferBlitで縮小しつつコピー
- glGetTexImageでメモリに持ってくる
こんなん。BlitはLINEARで拡大縮小しつつコピーできるので便利ですな。
かなり前に試した限りではBlitで拡大縮小したらちゃんと動いてくれなかったんだけど、さすがに今は大丈夫か。
この方法だとGL_EXT_framebuffer_objectとGL_EXT_framebuffer_blitが必要になっちゃうんだけど、少なくともSnow Leopardではソフトウェアレンダラでも両方サポートされてるんで大丈夫じゃないだろうか。10.5.6でもGeforce9400Mならどっちも使えるようだ。
使えなければ縮小しなけりゃいいよね!
Blitしなくても一旦テクスチャにコピーしたのをFBOに描画してどうのこうのっていうのもできなくはない。BlitはなくてもFBOくらいは要求してもいいいでしょう。10.5以降必須にすればね。これだと間にシェーダ挟めばカスタムの縮小フィルタかけられるし。
あとは上の方法だとカーソルが取り込めないんだよねぇ。どうすりゃいいのか調べてみたんだけど、カーソルのイメージを取得して自前で描画してやる方法しか思いつかなかった。うーん。
でもまあFBOを使うことにしたのでBlitしたあとにカーソルイメージを描画するのは簡単そうだ。これでいけるかなぁ。
MacはこれいいけどWindowsでの画面取り込みと縮小をどうするかだよなぁ。あとで考えるかー。
_ [Riko] Riko日記
えーと、前回どこまでかいたっけ。ああ、描画できるところまでか。
GLSLシェーダを実装しようとしたら色々とインターフェースに不備があったのでそれを適当にあしらいつつ実装。
そんなに苦労せずにできた。まあ今まで動いてたところだしそりゃそうか。
しかしテストを書いたらちゃんとリソース破棄はしてるはずなのに、正常に描画されない時があるなぁ。こまったものだがなんでだろ。
それは見なかったことにするとして、あとはアセンブリシェーダの方の作りなおしがしたいな。
その次にRenderStateをやれば一通りベースは一新なので、その上をちょこちょこ直していこう。またデスクトップマスコットが動けばおっけーだ。
しかしなんでこんな大整理始めちゃったんだっけ…?