3D visionと開発環境
環境設定をメモします。あくまで個人的なメモです。
このメモ時点での環境
  1. マシン:某99電気のBTO
  2. OS:Windows 7 (64bit)
  3. C++コンパイラ:Visual Studio 2008 Pro
  4. CPU:core i-7 950
  5. グラフィックボード:GeForce GTX570
  6. モニター:ASUS VG236 (3D vision セット)
  7. プロジェクター:NEC NP216J-3D
このような開発環境でスタート。DirectX 11自体はそれなりのグラボとWin 7なら開発できるので、 問題はモニターとプロジェクターが3D vision対応かどうか。もちろんグラボもNvidiaで。

3D visionドライバのインスコ

暫くたってkらこの記事を書いているので忘れてしまった部分もあるが、一番の注意点は、3D visionドライバとグラフィックドライバは同時に同じバージョンのものを入れる必要がある。どうやら通常のグラフィックドライバーがリリースされても、3D vision用のドライバーは遅れてリリースするらしい。そのため3D visionを使いたいなら、グラボの通常ドライバを最新版にしてはいけない。まずはグラボのドライバをアンインスコした後、3D vision用のドライバセットを公式よりDLしてインスコ。これによって、グラボの通常ドライバもバージョンの合ったものが一緒に入る。

3D vision discoverのインスコ

3D vision discoverとは3D visionセット(シャッターメガネと、同期信号を出す箱)がなくても立体視ができるドライバ。シャッターメガネではなく赤と青のレンズのメガネで見ると色は悪いが立体に見える。メガネはセロハンで自作しよう。

モニターの接続

モニターが120Hzのものであれば、3D visionで擬似立体視(VR)出力が可能。設定をするには、 「NVIDIAコントロールパネル」の「ステレオスコピック3D」の項目で行う。 チェックを入れば、あとはDirectXで表示されるソフトウェアを全画面表示にすれば自動でVR表示される。 DirectX SDKのサンプルで適当に遊ぼう。全画面表示はSDKサンプルの場合「Alt+Enter」でおk。DirectX 10以降なら特殊なことをしない限りSwapChainの機能で大体これで全画面化できそうね。

プロジェクターの接続

これは非常に悩んだ。 買ったプロジェクターは3D vision対応の癖にD-sub 15ピンのVGA入力しか端子が無い。DVIやHDMIが無いのだ。 仕方ないのでDVI→VGA変換プラグをかましてプロジェクターに入力。しかし、3D表示しない。 試行錯誤の結果、次の設定でうまく行ったのでメモしておく。

プロジェクター側の設定(NEC NP216J-3D)

オンスクリーンメニューから「セットアップ」→「3D」の欄で「3Dモード」をオンにし、「DLP Link」をオフにする。これでプロジェクター側が120Hz信号を受け取れるようになるようだ。

グラフィックボード側の設定(GeForce GTX570)

NVIDIAコントロールパネルの「解像度の変更」で、1024x768を選択。ただし、これではリフレッシュレートが75Hzまでしか選択できない。そこで、「カスタマイズ」ボタンを押して1024x768で120Hzの設定を作る(選ぶだけでいいかも)。これによってD-sub 15ピンでもグラボ側から無理やり120Hzで出力できるようになる。

複数ディスプレイでの注意点

さて、GeforceGTX570ではDVI出力端子が2つあるので、モニターとプロジェクターのマルチディスプレイ表示が可能である。ただし、3D visionによるVR出力ができないようだ。ミラーリングでも不可。結局、うまくVR出力されるのは、ディスプレイは目的のものを除いて無効化し(win7の「画面の解像度」設定でおk。デスクトップで右クリック)、シングルディスプレイ出力にする必要がある。

DirectX 11におけるバックバッファの設定

これも悩んだ。資料をよく読めば書いてあるんだろうけど。。。
なにかというと、DirectX SDKのサンプルのうち、「DecalTessellation11」は問題なく3D visionでVR表示されるのだが、Tutorial01~07はどうやらシャッターメガネとの同期が取れていないのか、左右の映像が両目共に表示されてしまう。ソースを比べると前者はDXUT(ウィンドウ処理のラッパー。GLUTっぽいもの)を使い、後者は直にウィンドウとデバイスの初期化を行っている。そこで、よ~く見比べると、BackBufferの設定に違いが。結論からいうと、3D visionの表示には、BackBufferの数を2つ用意する必要があるようだ。Tutorial01~07では1つしかBackBufferを設定していなかった為に正しく表示されていなかったようだ。次のようにソースコードのDXGI_SWAP_CHAIN_DESCの設定値を書き換えれば、Tutorial系でも正しく3D visionで表示できる。

    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory( &sd, sizeof( sd ) );
    sd.BufferCount = 2;          //ここを 1 から 2 に変更.
    sd.BufferDesc.Width = width;
    sd.BufferDesc.Height = height;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = g_hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;




Atsushi M. Ito web