月別アーカイブ: 2010年1月

OpenGL を Direct3D 互換で使う

モバイル系の API はほぼ OpenGL ES 2.0 で統一されつつあります。

Direct3D Mobile は DirectX8 ベースのサブセットで、固定機能パイプラインだけが
残されています。OpenGL ES 1.0 世代と同等、機能的には DirectX7 相当と言って
差し支えないかもしれません。

プログラマブルシェーダーの仕様を取り込んで Direct3D9 相当の仕様まで進んだのは
OpenGL ES 2.0 だけでした。WindowsCE 採用の端末でも 3D API としては
OpenGL ES 2.0 が用いられていることが多いようです。

そこで最近は OpneGL 上でも動くよう、互換性を考えて描画エンジンやライブラリを
作ることが多くなりました。普段デスクトップ PC では Direct3D を使いつつも、
モバイル系への応用を考えて OpenGL にも対応しています。

幸いなことにプログラマブルシェーダーが一般化しており、座標系や Matrix の扱い方
などはプログラマに開放されています。
もはやレガシーな入門書の通りに従う必要は無くなりました。

双方とも一番下の描画 API だけ使う分にはほとんど差がありません。どちらの API を
使おうとも動いているハードウエアは同じなので、当たり前といえば当たり前です。

Direct3D の方が経験が長いので、個人的には Direct3D 互換のまま使えた方が便利です。
これまで溜め込んだ 3D のライブラリ群やシェーダー、ツールを活用することができるからです。

逆に Direct3D での蓄積が特に無く、OpenGL 用の上位ライブラリやツール類を使う予定が
あるなら、素直に OpenGL の流儀に従った方が混乱は少ないでしょう。

● OpenGL を左手座標系で使用する方法

過去に下記のエントリで触れています。

OpenGLES2.0 D3D座標系

基本的に何もする必要が無く、使う側でどちらか一方に定義してしまえば終わりです。
カリングの向きだけ違うので変更しています。

座標系の違いは文字コードの違いのようなもので、どちらかの流儀で統一してしまえば
混乱はありません。中途半端に混在していると、相互に変換が必要になったりと
ややこしいことになります。

● OpenGL と Direct3D の座標系の違い

OpenGL 座標系と Direct3D 座標系の違いは、左手系、右手系以外にもあります。
Clip 座標系の Z の範囲が異なります。これは VertexShader の出力値に相当します。

OpenGL: -w ~ w
Direct3D: 0 ~ w

w の範囲はどちらも n~f なので、OpenGL では -n ~ f, Direct3D では 0 ~ f の値を
とります。Direct3D 用に作られた Projection Matrix を用いて OpenGL の VertexShader
から出力を行うと Z の範囲が狭くなっているわけです。

OpenGL 用のドライバは -w ~ w の値を期待しているので VertexShader の出力値も
あわせて補正します。

vec4    opos= vec4( POSITION.xyz, 1.0 ) * ProjectionViewWorld;
opos.z= 2.0 * opos.z - opos.w; // 0~w → -w~w
gl_Position= opos;

符号が異なるものの、この変換を事前に Matrix に畳み込んだのが OpenGL の
Projection Matrix といえます。

どちらも最終的には Z バッファ格納時に 0~1.0 の範囲に変換されます。
ドライバなり何らかの追加ハードウエアによって、上で追加した補正と逆の変換が行われて
いると予想できます。
OpenGL の VertexShader のあとに、変換するためのシェーダー命令がいくつか挿入されて
いるのかもしれません。仮に PostVertexShader としておきます。
Direct3D の場合は最初から 0起点で求まるので、VertexShader 後段での z 変換は
w 除算のみと単純になっています。

この違いはシャドウマップを扱うとよくわかります。

● OpenGL と Direct3D のシャドウマップ

バッファに格納された depth 値は 0~1.0 の範囲なので、ハードウエアシャドウマップも
この範囲で比較が行われます。

Vertex Shader の出力は Clip 座標であるため、その後の 0~1.0 への変換は触れない
ところにありドライバに任されています。

ところがシャドウマップ参照時に比較に用いる depth シェーダー側で用意しなければ
なりません。光源の Projection Matrix 適用後に Z 範囲を 0~1.0 に変換するわけです。
結局 PostVertexShader が Z をどう変換しているのか知っておく必要があります。

OpenGL 用の HW Shadow Map のサンプルを見ていると、Texture 座標変換 Matrix に
X,Y (u,v) だけでなく Z にも 0.5 のスケーリングと 0.5 のオフセットが加えられて
いるのがわかります。

これは Direct3D では存在しないパラメータで、PostVertexShader が行っている
補正と同じことです。実質 OpenGL でも Shadow Map 時には、Direct3D 相当の Matrix を
作っていると言えるかもしれません。

Direct3D の場合はそのまま z/w だけで 0~1.0 になるため比較的シンプルです。

●まとめ

今のところ Culling、VertexShader 出力 z 値の補正、の 2点だけで Direct3D と全く同じ
データや演算ライブラリを使っています。今後他にも変更点が出てくる可能性があります。

API の使い方とかリソースの変換も必要ですが、そのあたりは過去のエントリでも
触れています。

関連エントリ
OpenGLES2.0 DDS テクスチャを読み込む
OpenGLES2.0 Direct3D とのフォーマット変換
OpenGLES 2.0 頂点フォーマットの管理
OpenGLES2.0 の頂点
OpenGLES2.0 D3D座標系
OpenGLES2.0 シェーダー管理

LOOX U G90 と Multi Touch

先週末 LOOX U/G90 を店頭で触ってきました。
見事にマルチタッチ対応でした。

FUJITSU LOOX U

HP のデスクトップのような光学式でもなく、HP のノートのような複合型でもなく、
抵抗膜式のマルチタッチパネルだと思われます。
ペンも使えるし、WindowsMobile 端末のように表面のシートを押し込む感覚があります。

とりあえず Windows のペイント上で指 5本分 (同時に 5点) 認識していることは確認できました。
実際はもっと識別出来るかもしれませんが、画面が 5.6インチと小さいため試すのも結構
大変かもしれません。
開発機としても結構惹かれるものがあります。

キーボードは、以前購入した初代 LOOX U とは比べものにならないくらい打ちやすかったです。
QWERT の段が左にずれているのさえなければ、文字入力用途で買っていたかもしれません。

関連エントリ
Windows7 Multitouch API (3)
Windows7 とマルチタッチ / HP TouchSmart PC IQ800

ELECOM Bluetooth Keyboard TK-FBP013

小型ながらキー配列が素直で、Bluetooth Keyboard としては比較的安かったので
買ってみました。当初の動機はそれだけだったのですが、予想外に便利な機能を持った
キーボードでした。

ELECOM TK-FBP013
ELECOM TK-FB014

最大の特徴はのキーボード一つで複数の PC を同時に操作することができること。

複数の機器とペアリング状態を保持できる機器は他にもありますが、使えるのは基本的に
同時に一対一でした。ましてやキーボードの場合、つなぐ相手によっていちいちペアリング
し直さなければならないことがほとんどです。
複数の端末を使っていると USB ケーブルを抜き差しする方が簡単じゃないかとたまに
思うことがありました。

ところがこのキーボードはキー入力の相手をいつでも切り替えることが可能です。

操作も簡単でいつでも [Fn] + [1]~[9] のキーを押すだけ。
接続相手が 2台なら [Fn] + [Tab] で交互に切り替わります。

[1]~[9] の 9 台の PC を使い分けることが可能で、キーボード切替器を内蔵している
ようなものです。しかもワイヤレス。

あまり使わないサブマシンやゲーム機のキーボードを統合するのにぴったりです。

キーボード自体は SANWA SUPPLY の SKB-BT1 によく似ています。
LED の位置や裏面のスイッチの場所を見ても、ベースは同じではないかと思います。

キーボードの段にも左右のずれが無く、サイズが小さいけど割と自然にタイプできます。
まだ新品なせいもありますがタッチも良好な部類でしょう。

気になった点は間違って押しやすい位置に Num Lock があること。
気がついたらテンキーモードになっていたことが何度かありました。

逆にペアリングは表面の2キーを同時押ししたまま裏の小さいボタンをクリックします。
これが指で押せない構造なので最初は難易度高いです。

もう一つ残念な点は素早くタイプしているとキー抜けが結構あることです。
もしかしたら個体差か不良かもしれません。手持ちのキーボードだと特に [A] のキーが
入りにくいようです。
電波状況のせいなのか、シートスイッチの接触が悪いのか、またはキーの抜けが悪くて
ロールオーバーの制限に引っかかっているのかはわかりません。

常用は諦めたけど接続先の切り替えは便利なので、この機能を持ったまま確実に
タイプできる高級なキーボードが出てくれたら多分買っているでしょう。

DirectX 11 /Direct3D 11 Caps RADEON HD 5850 / GeForce GT 240

一ヶ月遅れですが RADEON に戻したのでドライバを更新しました。
こちら と比べるとわかるとおり、Concurrent Creates 対応になっています。

RADEON HD 5850 Catalyst 9.12 Windows7 x64

Direct3D 11
   Feature Level                   D3D_FEATURE_LEVEL_11_0
   Driver Concurrent Creates       Yes
   Driver Command Lists            No
   Double-precision Shaders        Yes
   Compute Shader 4.x              Yes
D3D_FEATURE_LEVEL_11_0
   Shader Model                    5.0
   Geometry Shader                 Yes
   Stream Out                      Yes
   Compute Shader                  Yes
   Hull & Domain Shaders           Yes
   Texture Resource Arrays         Yes
   Cubemap Resource Arrays         Yes
   BC4/BC5 Compression             Yes
   BC6H/BC7 Compression            Yes
   Alpha-to-coverage               Yes
   Extended Formats (BGRA, etc.)   Yes
   10-bit XR High Color Format     Yes

Command Lists がまだなので、スレッド完全対応もあともう少しです。

他にも OpenGL 3.2 対応など機能拡張されているようです。
気がついた点としては、GeForce と同じように最初から OpenGL 3.2 の Context を
返してくること。従来は 2.x ベースでした。
ただ 3.2 の API できちんと動いていない部分があるので、API だけ 3.1 に落として
使っています。3.1 context を作っても GLSL は 1.5。

※ 2010/01/31追記: Catalyst 10.1 (2010/01版) では改善されており、RADEON 上で OpenGL 3.2 がきちんと動いています。

2枚目用に補助電源無しの GeForce が必要になったので、
DirectX 10.1 対応のGeForce GT 240 を買ってみました。

GeForce GT 240 Driver 195.62 Windows7 x64

Direct3D 11
   Feature Level                   D3D_FEATURE_LEVEL_10_1
   Driver Concurrent Creates       Yes
   Driver Command Lists            No
   Double-precision Shaders        No
   Compute Shader 4.x              Yes
D3D_FEATURE_LEVEL_10_1
   Shader Model                    4.x
   Geometry Shader                 Yes
   Stream Out                      Yes
   Compute Shader                  Optional (Yes)
   Hull & Domain Shaders           No
   Texture Resource Arrays         Yes
   Cubemap Resource Arrays         Yes
   BC4/BC5 Compression             Yes
   BC6H/BC7 Compression            No
   Alpha-to-coverage               Yes
   Extended Formats (BGRA, etc.)   Optional (Yes)
   10-bit XR High Color Format     Optional (Yes)

GeForce ながら 10.1 に対応していることがわかります。
Shader Model に 4.x と表記されているのは 4.1 のことです。
もっと細かい違いとか踏み込んで調べたいところですが、時間的にしばらくは無理そうです。
そうこうしているうちに Fermi も出てきそうですね。
後発は機能拡張に積極的なので Fermi 系 2世代目が出るあたりには D3D の次の
バージョンが見えてくるのかもしれません。年末あたりでしょうか。

関連エントリ
DirectX 11 / Direct3D 11 と RADEON HD 5870 の caps

Vuzix Wrap 310

Wrap 310 買ってみました。
ヘッドマウント型のディスプレイです。

Vuzix

2009年12月4日の発売直後に購入したものの、すぐに映像がうまく出ない状態に。
初期不良だったようで、直販で購入したおかげか手際よく交換してもらえました。
結局 12月半ばに使えるものが届きました。

Wrap 310 は一見サングラスに見える外観が特徴ですが、掛けた状態で外部が透けて
見えるわけではないようです。グラス部にはデバイス本体とモニタがあり、小さい窓から
映し出される映像をのぞき込みます。目との間隔は想像よりも大きく、隙間があるので
手元など周囲も結構よく見えます。逆に周囲からも目が見えていると思います。

この手のデバイスは以前から発売されていました。従来水平に配置されていたユニットを
そのまま 90度上に回転させた構造になっているようです。薄くしてめがね形状の中に
納めるためでしょう。
そのせいでユニットの最下部にミラーがあり、反射した映像を見る形になります。

このミラーが構造上一番下にあるので、目の位置もかなり下に位置します。
つまりサングラス型とはいえ、一般のめがねと比べるとかなり上の方に持って行か
ないと映像が見えないことになります。
個人差があるとは思いますが、ノーズパッドを思いっきりのばしてぎりぎりでした。

映像部は左右独立したピント調整が可能で、調整用の専用ドライバがコントロール
ボックスに取り付けられています。電池もボックス側。ディスプレイ部との接続は
ワイヤードです。

色の濃さや明るさなどは、画面上のメニューを見ながらコントロールボックスで操作
します。こちらは両眼ともいっしょで、独立した設定は出来ませんでした。

用途としてはビデオ出力経由で映像などを見ることになります。外出時など外から
のぞき込まれる心配はなくなりますが、逆に自分自身がよけい目立つかもしれません。

もう一つの用途は 3D 映像の視聴です。いくつかの 3D フォーマットに対応しており、
左右独立した映像を映すことが可能です。

使っていて気になったのは、左右の明るさが異なって見えること。個人差や個体差
かもしれませんが左側だけ暗部が落ち込んで暗めに映っているようです。
全体を明るめに設定したり、左側のユニットの明るく見える位置に調整すると
左右同じように映ります。

片方だけ明るさが異なっているとそこだけ立体に見えてしまいます。
PC の画面をビデオ出力して web ページを見ていただけなのに、なんで立体に見えるの
だろうと最初は不思議でした。左右独立した画質調整機能が欲しくなります。

画質はビデオ信号だし解像度も低いので過度に期待するほどのものでは無いようです。
持ち歩けるモニタとして使えますが、映像も iPhone 等メディアプレイヤーの画面を
そのまま見た方がおそらくきれいで手軽だと思います。

逆に Wrap 310 でしかできないメリットは、利用時に首の位置を固定されないことでしょう。
ビデオ出力で PC の操作をしてみましたが、リラックスして椅子にくつろいだ状態だろうと、
どの方向を向いていようと常に正面で画面を見ることが出来ます。
マウスにだけ手が届けばあとは自由。
解像度は低いけど、普段のモニタとは全然別の方を向いたまま操作できるのは新鮮です。

3D はコンテンツがないのであまり試せていませんが、サイドバイサイド形式などは
左右に分割するだけなので容易に作れそうです。使いこなすといろいろと面白いと
思います。

関連エントリ
ニコン UP300x/UP300 を体験してきた。ヘッドマウントディスプレイ