• DirectX モジュール 1.0.3

    2012年02月20日 20時16分
    D言語(D2)用 DirectX モジュール

    コンパイルエラーが残っていたので修正しました
    libファイルも追加しました
  • DirectX モジュール 1.0.2

    2012年02月17日 01時43分
    D言語(D2)用 DirectX モジュール

    dmd 2.058でbase class protectionが使えなくなったので修正しました。
  • D言語 + DirectXのサンプルの焼き直し

    2012年01月17日 21時43分
    前回のやつを色々いじくっていて思ったのが、
    Direct3Dは10以降が楽でいいなぁということです。


    Direct3D 10以降はここがスゴイ!
    • デバイスロストを気にしなくて良い
    • ウィンドウのリサイズが簡単
    • 標準でAlt + Enterも動いちゃう
    • シェーダが書きやすい


    最大のデメリットとしてWindows XPで動かないというのがありますが、
    さすがに発売から10年以上経ってるOSはもういいだろという気がしてきました。

    あと、2012年になっているというのに、
    「ハードウェア的には対応しているがドライバが作れないのでDirect3D 9までの対応です。」
    というGPUが未だ新製品として出てくることに不安を感じますが、
    とりあえず黙殺していいんじゃないかな・・・と思います。



    そういう訳で、Direct 3D 11のウィンドウリサイズ辺りの処理を書いてみて
    すこぶるテンションが上がったのでサンプルをアップしてみようと思います。

    スクリーンショット


    ソースです。
    Direct3D 11化してある以外は昔アップしたものとだいたい同じです。(昔アップしたのはDirect3D 9)

    ウィンドウリサイズが楽しかったので、大きい画面にしてみました。
    有名なフルHDテトリス(っぽいもの)になっています。
  • DirectX モジュール 1.0.1

    2011年12月26日 01時52分
    D言語(D2)用 DirectX モジュール

    dmd 2.057でtypedefが使えなくなったのでaliasに書き換えました。
  • Windowsで動く壁紙

    2011年12月03日 21時19分
    PS3はXMBのテーマによっては背景が動いたりします。

    例えば、画像だとわかりにくいですがクロが踊ったりしてます。
    XMBのSS

    これ、Windowsでも同じこと出来ないのかと思ったのが今回の話。



    デスクトップの背景部分に画像を転送するAPIを見つけて
    Direct3Dのレンダリング結果を投げ込めばいいだろうと始めてみたのですが、
    そもそもデスクトップの背景を操作するようなAPIが見つからない。

    そういえばそういうソフト見たこと無いなと思って探してみたのですが、
    動画を壁紙にするソフトはあるものの、
    壁紙や背景を描画対象にするようなプログラムが見つかりません。


    近いものとしては、他のウィンドウをキャプチャするプログラムがいくつか見つかりました。
    キャプチャするバッファに対して逆に書き込みを行えば
    表示を乗っ取れるのではないかという目論見です。


    というわけで次の手順で適当なウィンドウのバッファを取ってみました。
    1. dwmapi.dllのindexが100の関数を取得
    2. 取得した関数で共有リソースのハンドルを取得
    3. ID3D10Device1.OpenSharedResourceを使って共有リソースハンドルからID3D10Resourceを取得
    4. ID3D10Resource.QueryInterfaceでID3D10Texture2Dを取得

    ソース


    このウィンドウのバッファを取ります。
    対象のウィンドウ


    BMPファイルとして保存したもの。
    キャプチャ結果

    真っ黒です。

    でも、D3D10_TEXTURE2D_DESCはきちんと取れています。
    さらに、書き込みも出来るようです。紫で塗りつぶした後キャプチャしてみました。
    塗りつぶし結果

    なぜか黒いしましまが入ります。
    ちなみにキャプチャ元のウィンドウに変化はありません。


    どうも根本的なことが間違っている気がしますが、さっぱりわかりません。
    dwmapiから取る関数がVista用なのかもしれません。(参考にしたソースがVista用っぽい)
    でも残念ながらVistaマシンなんてありません。


    他に少し考えたのは、DWMの内部バッファなんか無理にさわらなくても、
    ウィンドウのZ値をデスクトップのアイコンより後ろにするとか出来ないものか。など。

    あとは、描画 → ファイル保存 → 壁紙設定を高速で繰り返せば
    一応動くような気もしますが、さすがにそれば・・・


    何か良い知恵がある人は教えてください。
    ナイスな情報を教えてくれた人には何かしらお礼します。