ふと思い立ってVistaというかDWMについて調べてみた。
スクリーンキャプチャについてなんだけど、普通にとるならGetDC(NULL)とかで画面のDC取って読み出すのが動く。
でもこれってDWM有効な場合のまともな方法とは思えないんだよね。
で、調べてみたんだが、やっぱりいい方法では無いらしい。と言うか無理という記述も見受けられるんだが、いや動いてるからそんなことは無いだろう。しかし昔は無理だったのかもしれない。
Direct3D9Exではシステムメモリにサーフェス作ったりプロセス間共有サーフェス作れるようなので、それを取得するのかと思ったけど取得できそうなインターフェースは見当たらなかったよ…。
他にはウィンドウごとのサムネールを取得できるAPIはあったけど、トップレベルウィンドウ単位じゃなくてウィンドウ合成後のイメージが欲しいんですけど。
あ、合成後のイメージはVRAMにしかないんかね。ありえるねそりゃ。
だとするとそう簡単には取得できないかも。高速に画面取り込みできるかとおもったのにちょっとしょんぼり。
いまの所はGDIで取り込むしか無いのかな。せっかくのDWMにGDIで踏み込んでいくのは気が退けるんですけど。
VistaでOpenGL使うときはGDIと混ぜちゃダメ!ゼッタイ!!ってだけだと思ってたんだが、DWM辺り調べるついでに確認してみたらちょっと違うっぽい?
基本的にはGDIとOpenGL混ぜちゃダメだしスクリーンのDCに直接描くのも無し*1だゴルァ、というので合ってるんだけど、PFD_SUPPORT_COMPOSITIONとかいうピクセルフォーマット指定があるのか。初めて知った。でもこれ有効にしなくてもDWM切れてないよ?
ん、うちのVistaはHome Basicだからウィンドウ透けなくて分かりづらいけど実は切れちゃってるとか?いや、切れたら影も付かんし通知は出るし露骨に分かるってな。
もしかしてこのフォーマット指定するとOpenGLで直接透過ウィンドウ描画できちゃう?やってみようかな。
しかしこのへんのドキュメントが全然無くて困るなぁ。Direct3Dに統一したいMSにしてみたらOpenGLなんて目の上のたんこぶみたいな物かも知れんけど、追加されたピクセルフォーマット指定くらいはドキュメント更新してくれてもいいじゃないか。
PFD_DIRECT3D_ACCELERATEってなんだろう…。Direct3Dの描画もサポートするってな感じのドキュメント見つけたけど、その上になんかあるPFD_SUPPORT_DIRECTDRAWと明らかに違いますよね?
VistaのDirect3Dでエミュレーションする標準OpenGLドライバ指定とかだろうか。むむむ、謎だ…。
*1 というかウィンドウの外に描くのは一切無し
ピクセルフォーマット関係なくね?
動作確認してみたけどPFD_SUPPORT_COMPOSITIONは付けなくても変わらず。そりゃそうだよな。付けなくてもちゃんと動いてたし。
PFD_DIRECT3D_ACCELERATEも付けても変わらず。と言うかたぶんこれ自分で付ける物じゃないのでは。Direct3Dのレンダリング先になったときに勝手に付くんじゃないだろうか。
なんとか頑張って透過ウィンドウ描画できないものかとやってみたが、少なくともうちのマシンのグラボでは無理っぽい。背景がどうしても黒くなっちゃうよ。
PFD_SUPPORT_GDIにしたらソフトウェアレンダリングになって、DwmEnableBlurCompositionだかなんだかを有効にしたら透けた。HomeBasicだからちゃんと透けないけどね。PFD_SUPPORT_COMPOSITIONの有無は関係なし。
もしかしてPFD_SUPPORT_COMPOSITIONも特に指定せずにも勝手に付く物なんじゃね?それならドキュメントに書いてないのも納得がいくけど。いや、もしかしたらドライバによっては明示的に指定しないといけない?
まあ指定できるならしといて損は無いのかも知れんけど。
ところでソフトレンダラがOpenGL1.1だったのはなんでですか。VistaではDirect3Dエミュレーションで1.4というのは俺が聞いた夢ですか。
いやまてよ。Direct3Dが使えてなおかつOpenGLが使えないときにエミュレーションレンダラが使われるのかも。しかしどんなレアな状況だよそれは。
なんにせよVistaでは標準で1.4だと思っていたがそんなことは無かったぜ。
それはともかく、Vistaで行儀良くOpenGL使うにはGDIと混ぜないだけで十分な気がするな。つか、OpenGLとGDI混ぜるとかXP以前でも行儀悪くないですか?
今回はChrome430GTだったけど、もしかしたらもっとしょぼいドライバだったらPFD_SUPPORT_COMPOSITION付けないと問題出るかも?でもさすがのIntelでもそこまでアレなドライバは書けそうにないので気にしなくていいかもな。