日別アーカイブ: 2010年9月7日

ZALMAN モニタでとりあえず 3D (立体視)レンダリング

立体視対応のモニタもかなり入手しやすくなりました。
ZALMAN の 3D モニタは偏光式で、チラツキもなくメガネも軽量で安価なのが特徴です。
その原理も非常にシンプルで、ラスタ単位に交互に右目と左目の映像を描画するだけで
立体現できます。

ZALMAN ZM-M215W

推奨された使い方ではないと思いますが、RealD の映画館でもらえる円偏光式のメガネが
そのまま使えました。モニタについてくるメガネは幅が狭いのでこちらの方が快適です。

HDMI の 3D フォーマットの入力はできないので PS3 はつながりません。
でも原理が簡単なのでとりあえずプログラムで描画するだけなら簡単に対応できそうです。
眼鏡をつけると縦の解像度が半分になるものの、そのまま他の(非ZALMAN)モニタを
見ることが可能。
画面は暗くなるけど開発時の作業をしていても比較的負担が少ないと感じました。

●レンダリング

ラスタ単位に左右 2枚の絵を交互に合成します。

zalman3d01.jpg

 ・バッファに左右分 2枚レンダリングしてからあとから合成
 ・Alpha Test や Stencil Test を使ってマスク

等の方法が考えられますが、とりあえずすぐに効果を確認したかったので効率は考えず
Pixel Shader (Fragment Shader) でラスタ分離してみました。

// OpenGL GLSL 4.0 fragment shader

in vec4        gl_FragCoord;
uniform vec4   LeftRight;

void main()
{
    if( (int(gl_FragCoord.y + LeftRight.x) & 1) == 0 ){
        discard;
    }
~
}

既存のシェーダーに追加したのは上の 5行だけです。
gl_FragCoord はフラグメントのスクリーン座標が入る予約 Uniform です。
この gl_FragCoord.y を見るだけで偶数ラインか奇数ラインかわかります。

LeftRight.x には左画面か右画面かに応じて 0 or 1 の値を入れておきます。
あとはカメラを変えて、同じフレームバッファに 2回同じ絵をレンダリングするだけです。

 1. 左目用カメラを設定
 2. LeftRight.x = 0
 3. レンダリング

 4. 右目用カメラを設定
 5. LeftRight.x = 1
 6. レンダリング

右目と左目が逆になる可能性があります。
ウィンドウの位置によって、描画を開始するラスタが変わるからです。
よってウィンドウのクライアント領域の座標を求めて、左右の切り替えに反映させる
必要があります。

ただの確認だけなら、手動で左右切り替えられるようにしておけば問題ないでしょう。
裸眼立体視の交差法モードとして使えるので左右切り替えは何かと役に立ちます。

即席の Zalman モニタ対応でした。

関連エントリ
Vuzix Wrap 310
3D開発環境(立体視)まとめ