2010年12月18日土曜日

Quadro で NVIDIA 3D Vision な OpenGL のプログラムを作る

3Dグラフィクスで遊んでいるからには
やっぱり、最近はやりのステレオ表示が気になるわけで。

(「3D」っていうと、ポリゴンな「3Dグラフィクス」のことなのか、
それとも「立体視」のことなのか紛らわしい、と思う今日この頃。)

ってことで、思い切って
3D対応のディスプレイ(GD245HQ)と
NVIDIA 3D Vision (アクティブシャッターの付いたメガネのアレ)を購入し、
ステレオ表示環境をそろえてみた。
(ディスプレイについてのレビューは、またそのうち、ってことで。)

で、そうなってくると、
OpenGLのステレオバッファを使って
自分でステレオ表示ができるプログラムを作ってみたくなるのだが、
GeForce系ではステレオバッファがサポートされておらず、
実質的にはQuadro系のグラフィックボードを使うしかない。
ということで、つづいてQuadro 2000を購入。
Quadro高いよ・・・。

ってなことで、
OpenGLでステレオバッファを使ってステレオ表示する方法を調べてみた。

→プログラム側でやること

  • まずは、レンダリングコンテキストを作成するときに
    ピクセルフォーマットでスレテオバッファを指定。
  •  で、右目用、左目用のシーンを
    glDrawBuffer() で BackLeft, BackRight を指定して
    左目用バックバッファと右目用バックバッファそれぞれに描画する。
  • wglSwapBuffers() を呼べば
    BackLeft, BackRight 両方いっぺんにフロントバッファに
    転送されるので、そこはあんまり気にする必要は無いっぽい。
→PC側の設定
 NVIDIAコントロールパネルで設定する必要があるのが少々めんどくさい。
  •  NVIDIAコントロールパネルの「Manage 3D setting」内、
    「Program Setting」タブで、「Add」ボタンをクリックしてビルドしたプログラムを選択。
    (Visual Sutudio のデバッグで実行する場合は、~.vshost.exe を選択する。)
  • でもって、その下のリスト(Feature - Setting のリスト)で、
    「Stereo - Display mode」 を 「Generic active stereo (with NVIDIA IR Emmitter)」、
    「Stereo - Enable」 を 「On」
    に設定する。
これで、プログラムを実行するとステレオ表示になって
同時にメガネのアクティブシャッターもONになるはず。
DirectXだとフルスクリーンにしないとステレオ表示できないが、
OpenGLだとウィンドウ表示でもステレオ表示できるみたい。
(ただし、Windows Aero がOFFになる。)

ちなみに、OpenGLの場合は
IR Emitter(メガネの同期用の赤外線送信機)の
On/Offスイッチと、裏のホイールは機能しません。
なので、プログラム側でステレオ表示のOn/Off機能とか
奥行き感の調整機能とかを用意しないといけないようだ。

あと、右目・左目のシーンを描画するときに、
左右の視点の位置のずらし方をうまくやらないと不自然な見え方になってしまうので、
このへんもプログラム側で工夫しないといけない。

3 件のコメント:

kaku2uma さんのコメント...

一歩二歩散歩さん

はじめまして。
一歩二歩散歩さんに習ってOpenGL×quadroステレオバッファを使って
立体視をしようとしている者です!

私はどうも視差の調節がうまくできなくて困っているのですが、
一歩二歩散歩さんはこの投稿の後どこまで進まれたのか教えていただけると幸いです。

一歩二歩散歩 さんのコメント...

初めまして。

正直なところ、最近はほとんどOpenGLのコーディングをしていないので、
これといったことはないのですが・・・

確か、
・右目用と左目用の2つのカメラの距離
・2つのカメラの視線が交差する点(注視点)
の2つが、立体感を調整するポイントだったと思います。
この注視点にあるものがちょうどモニターの画面上に見えます。

で、
・2つのカメラの距離
・カメラと注視点(のあたりに置いてあるオブジェクト)との距離
この2つの距離の比率が、現実の目の、
・両目間の幅
・目と物体との距離
の比率に近いと、
割といい感じに立体に見えると思います。

こんな感じでお役に立つでしょうか?

kaku2uma さんのコメント...

一歩二歩散歩さん

お返事ありがとうございます!
立体感を調整するポイントまで教えていただいてありがとうございます。
一歩二歩散歩さんは立体感を調整する辺りまで成功しているのですね。


私はそれ以前に課題がありまして、、、
私はglFrustum()を利用して立体視をしようとしています。
下記URLを参考にプログラムを書いて、
「真っ黒い背景に真っ白い球体を陰影ありで描画しよう」としているのですが、
(参考:http://www.wakayama-u.ac.jp/~tokoi/opengl/faq.html#Q7)

3D Visionゴーグルの一方の目はくっきり白く映るのですが、
もう片側が薄っすらとしか映らない状態で困っています。
(プログラムが悪さをしていると考えて、悪そうな部分を右目左目逆転させてみたところ、
薄っすらとしか見えない目も、同様に逆転しました。)

これをどうすれば解決できるのか、、というところでつまづいているので、
何らかのヒントをいただければなぁと思ってコメントしました。
お返事お待ちしております。