Archive for the ‘DirectX’ Category

自動整形機能のイライラを軽減するGoogle Syntax Highlighterプラグイン

どんな感じになるだろう。
ログ周りを追加してたコードの破片をぺたり。

#ifdef USE_DIRECTX8
    typedef D3DCAPS8 D3DCAPSX;
#endif

#ifdef USE_DIRECTX9
    typedef D3DCAPS9 D3DCAPSX;
#endif

#ifdef USE_DIRECTX10 // 今のところ未使用
    typedef D3DCAPS10 D3DCAPSX;
#endif

    D3DCAPSX caps;
    ZeroMemory(&caps, sizeof(D3DCAPSX));
    pDevice_->GetDeviceCaps(&caps);

    struct local {
        static const TCHAR* check(const bool v) {
            return v ? _T("○") : _T("×");
        }
    };

    typedef boost::format format;
    typedef TreeLogger logger;

    logger root("D3DCAPS", ofs, true);

おぉ、結構いい感じ!!

windows vista sp2 が来てました。
家に帰ったらさっそく入れてみます。

colinux 0.7.4 が来てました。
カーネルの更新や、ネットワークブリッジの更新なんかがあるみたい。
でも vista 64bit には相変わらず非対応。。

visual studio 2010 beta1 が一般公開されてます。
STL の見直しや、一部 C++0x 対応などがあるらしいです。

windows 7 RC が一般公開されています。

windows xp 入手困難に
新しい windows が見えてきましたけど、xp の在庫がなくなって来たようです。
欲しい人はお早めに。

 
amazon のアフィリエイトアカウント取ってみた。
ぶっちゃけアフィリエイトはどうでもいいんだけど、写真付きでリンク貼れるのが便利なのよね。

最近読んだ本

きじねこの高木氏の本。
組み込みといわず、C/C++のちょっとマイナーな話が面白い。


Faith and Brave のアキラ氏、東方算程譚のεπιστημη氏の共著。
template の仕組みやテクニックについてわかりやすく書かれている。
Modern C++ Design には挫折してしまったという人はこちらオススメ。

今読んでる本


まだ全然読めてないー

関連:東方地霊殿で d3dx9_37.dll が無いといわれる

今回は d3dx9_40.dll が必要なようです。
とりあえず、最新のDirectX のランタイムを入れれば問題ないです。
DirectX エンド ユーザー ランタイム Web インストーラ

d3dx9_40.dll は DirectX SDK Nov 2008 のものなので、最新のランタイムまではいらない人は下記をインストールすれば良いです。
DirectX End-User Runtimes (November 2008) – 日本語

Tech Days 2009 の動画が公開されていたので、川西先生のセッションを聞いてみました。
Windows7 からの Direct2D, DirectWrite の詳細や Direct3D 10 について興味がある方は是非聞いてみてくだしい。

Direct2D, DirectWrite は綺麗だなぁ。しかも早い、アンチエリアス使える、使用メモリは減る、何この完璧超人。
ただし戦うフィールドは選ぶ(vista 以降)

DirectX SDK (November 2008) にて追加された Direct3D10Level9、こいつが優秀。
Direct3D10Level9 は Direct3D 9 のハードウェアで Direct3D 10 を利用できるというもの。
OSがVista 以降っていう制限は相変わらずだけど、ハードウェアが DX10 未対応でも DirectX10 が利用できる点はすごいよこれ。
じゃあパフォーマンスはどうなのか?というと、十分出るという話です。
# 動作にはWDDM(Windows Display Driver Model) が必要だと仰っていましたが、Vista 以降なら勝手にドライバ入りそう。

Windows 7 ではリモートデスクトップが改善されるらしい。
Aero 対応や Direct2D, Direct3D10.1 によるクライアントレンダリングで描画がかなり高速になるよ!

しばらく更新してませんでした。家でカジキマグロ振っていました。

DirectX November 2008

今月になって新しいSDKが公開されました。DirectX11 のテクニカル プレビューも含まれてます。
Dynamic Shader Linkage なんてサンプルもありますYO!

某所にコメント書いたので、ついでにエントリ書きます。

自分のマシンには October 2004 と 最新のSDK(June 2008) を入れています。
最新のSDKは遊び用で、開発には October 2004 を使うといった具合です。

SDK の選び方はいくらか方針があると思います。
下記に DirectX 9, 10 について選ぶポイントを軽くまとめてみました。

・ユーザに d3dx9_XX.dll を必要とさせたくない
December 2004 までが static-link 形式のライブラリになっています。
HLSL も Shader3.0 対応済みで、Windows 2000 の最終サポート版SDKである October 2004 がオススメです。

・HLSLコンパイラ を使いたい
April 2007 以降で修正版が入っています。
別途 D3DCompiler_XX.dll が必要となっていますが。

・なるべくバグのない SDK を使いたい
最新のSDK はバグフィクスも含んでいます。
素直に新しいSDKを利用するのがよいでしょう。

・DirectX 10.1 を使いたい
March 2008 以降を利用します。

- オマケ -
ただし、最近のSDKには古いライブラリが同梱されていません。
古いライブラリを利用する場合、August 2007 以前のSDKも一緒に導入しておく必要があります。

現在公開されている日本語リファレンスは October 2004 のものです。

昨日書いたエントリ(DirectInput を使うとレジストリ登録される)の原因がわかりました。

DirectInput の初期化の際に、 DirectInput8Create 関数を呼び出すことでレジストリにキーが登録されるようです。
つまり下記のような初期化方法ではレジストリにキーが登録されます。

C++:
  1. HINSTANCE hInstance = ::GetModuleHandle(NULL);
  2. LPDIRECTINPUT8 pDirectInput = NULL;
  3. HRESULT hr = ::DirectInput8Create(hInstance,
  4.                                   DIRECTINPUT_VERSION,
  5.                                   IID_IDirectInput8,
  6.                                   (void **)&pDirectInput,
  7.                                   NULL);
  8. if (FAILED(hr)) {
  9.     //エラー処理
  10. }

ではどうするかというと、下記のような方法で初期化します。

C++:
  1. HINSTANCE hInstance = ::GetModuleHandle(NULL);
  2. LPDIRECTINPUT8 pDirectInput = NULL;
  3.  
  4. HRESULT hr = ::CoCreateInstance(CLSID_DirectInput8,
  5.                                 NULL,
  6.                                 CLSCTX_ALL,
  7.                                 IID_IDirectInput8,
  8.                                 (void **)&pDirectInput);
  9. if (FAILED(hr)) {
  10.     // エラー処理
  11. }
  12.  
  13. hr = pDirectInput->Initialize(hInstance, DIRECTINPUT_VERSION);
  14. if (FAILED(hr)) {
  15.     // エラー処理
  16. }

DirectInput8Create 関数では内部で上記と同じ処理をしているのでしょうが、そのときレジストリに登録する処理を行っているのでしょう。
レジストリにキーが登録されて困っている人は、COMからインスタンス作成&初期化で試してみてください。

昼間は鯖落ちしてました。

さて、表題の件。
自分もつい先日某所で知ったのですが。。

どういうことかというと、DirectInput を使ったアプリケーションは HKEY_CURRENT_USER\Software\Microsoft\DirectInput にキーが登録されてしまう。
いや、されるものがある と言うべきか。

こんな感じ。

登録されるタイミングは、アプリとタイムスタンプを見て登録。
つまり、開発者はビルド毎に登録されているようです。更新されるのではなく、重複登録されます。
ユーザ側ではリリースされたアプリ単位で登録されます。(アップデートパッチだとか)

さて、最初にも書きましたが 登録されるものがある です。
DirectInput を利用していても、レジストリ登録されるものと、されないものがあるのです。
この違いの原因を探りたいのですが、自分の書いたコードでは再現できなく、困っています。

とりあえず、重複登録に関しては MSDN に回避方法が載っています。 ここ
ですが、根本的な解決ではありません。結局登録はされますので。
登録されてしまう場合、独自にレジストリを削除する処理を入れるべき・・・なんでしょうか。。
# 個人的にはレジストリを弄る処理を極力入れたくありませんし。

ここでは解決方法を提示できませんが、今後解決方法がわかればエントリを書きます。
DirectX を使って開発されている方々は一度レジストリをチェックしてみると幸せになれるかもしれません。

解決しました → 「DirectInput を使うとレジストリ登録される」回避方法

価格で ATI に押されてるなぁと思っていたけど、nvidia ったらガンガン値下げしてくるねー。ソース
まぁ、冷静に考えて GeForce GTX 280/260の55nm版を出す前に売れるだけ売っとこうって感じなんだろうなぁ。

GeForce 260/280シリーズ が安くなってくると、Radeon 4800シリーズの魅力が減ってくるなぁ。

この確認をプログラムでやるには、どうするんだろうね。
d3d10.dll の存在確認をして、発見した!サポートされてる!ってのは違いますしねぇ。
API がグラボを見てチェックしてくれればいいんだけど。

今のところサポートされてるかを見ての初期化は

存在チェック > d3d10.dll あったら、DirectX10 で初期化してみる > 失敗したら、DirectX9 で初期化してみる

こんな感じなのか。。