2014/09/07

MacBook Pro Retina, Mid 2012でOculus DK2を動かす

はじめに

みなさんOculus Rift DK2 活用していますか?
高スペックPCを所有していないので,かるーいやつしか動かせていません.

SDKがver 0.4.1でosxにも対応されましたので,MBP retinaとりあえず動かしてみた次第です.※ 現時点(2014/09/07)の最新SDKは ver0.4.2です.

導入にあたりいくつか戸惑った点があったので,記録しておきます.

利用したもの

MacBook Pro Retina, Mid 2012

  • Processor  2.6 GHz Intel Core i7
  • Memory  16 GB 1600 MHz DDR3
  • Graphics  NVIDIA GeForce GT 650M 1024 MB
  • Software  OS X 10.9.4

Oculus Rift

Oculus Rift DK2 本体(HDM,カメラ)
Oculus SDK v 0.4.2 Beta (https://developer.oculusvr.com/?action=dl)
  • Oculus Runtime for Mac OS
  • Oculus SDK for Mac OS

導入方法

接続

oculus DK2本体およびトラッキング用カメラを接続します.
本体直挿しで,外部電源は不要でした.

Oculus Runtime for Mac OSのインストール

ドライバを入れないと認識しないので,上述のOculus Runtime for Mac OSをインストールします.dmgになっているので,叩くとマウントされます.

最近のosxはセキュリティが厳しいのでそのままでは動かないので,oculus_runtime_rev_1_sdk_0.4.2_osx.app を右クリックして「Open」から実行してください.


※ 多分私だけだと思いますが,ここでRuntimeのdmgを叩いてもインストーラが強制終了するという,不可解なエラーに遭遇しました.
原因はよく分かりませんが,ログ的にはメモリ確保にしくじっていました.
ググってみたのですが,英語圏でもそのような問題は出ていないようで,対処方法が見つかりませんでした.
結局,OSを再インストールしたら動くようになりました.
(OSのみ再インストールで,データはすべて残った状態で再インストールできたので良かったです…)

ファームウェア更新

firmware が最新じゃない場合は,最新にしておきます.(2014/09/07時点では,2.12です)
設定ユーティリティ (/Applications/Oculus/Tools/OculusConfigUtil.app)を起動して,メニューのTools/Advanced/Update firmware...から次のファイルを選択します.
/Applications/Oculus/Tools/Firmware/DK2/DK2Firmware_2_12.ovrf


画面の設定

ランタイムをインストールできたら,次はHMDの電源を入れて動作確認です.
osxの場合は,Extendモード(?)では動かないので,セカンドモニタとして認識されます.



ただい,接続しても画面周りがよく分からないことになっているので次の方法をとりました.


  1. osxの画面設定(Preferences/Display)を ⌘+altを押しながらクリックして開く(画面の回転を有効にするため)
  2. アレンジメントタブへ移り,画面のミラーを無効にする.
  3. "Gather windows"ボタンをクリック(言語環境が英語の場合.日本語だと何か不明)
  4. 出てきた画面で,90°回転にして,default/native解像度を選ぶ
  5. 画面設定に戻って,ミラーを有効にする.(メイン画面の色が変になるけどそういうもんらしいです)


(参考URL: http://www.reddit.com/r/oculus/comments/2dbxve/041_with_dk2_on_a_mac_incompatible_resolution/)


あとは適当なデモを起動してoculusライフを楽しんでください!


所感

どうにか,MBPでOculus DK2を動かせました.
とりあえず動くという感じ.重い奴はFPSが出ないので酔いが厳しい.

osx対応のデモはまだ少ないので見つけにくいと思いますが,だんだん増えてくることと思います.Matrixのやつ(http://www.tipatat.com/TheMatrixVR/)はosx版もありました.ジャンプが成功しませんのでコツがあれば教えて欲しいです…….

だいたいのデモは,PS3コントローラで操作できるっぽいので一つ買っておくと良いです.
多分Xbox360のコントローラでも大丈夫だと思いますが,所持していないためosxで動作するか不明です.readme.txtにはxboxコントローラの説明ばかりなのですよね.
ちなみにPS3コントローラの場合は,ドライバなど不要で,BluetoothをONにするだけで使えます.

2014/08/20

GLFWマルチモニタガイド 日本語訳

GLFWマルチモニタガイド 


モニタオブジェクト

GLFWmonitorオブジェクトは現在接続されているモニタを表現します。

モニタの取得

プライマリモニタはglfwGetPrimaryMonitorで返されます。 通常、ユーザの優先モニタで、タスクバーやメニューバーのようなグローバルUI要素を備えています。
GLFWmonitor* primary = glfwGetPrimaryMonitor();
glfwGetMonitorsで、接続されているすべてのモニタを取得できます。
int count;
GLFWmonitor** monitors = glfwGetMonitors(&count);

ビデオモードの取得

GLFWは通常、フルスクリーンウィンドウを開く際に適切なビデオモードを選択してくれますが、あるシステムで正確にどのモードが利用可能であるかを知ることは時々役立ちます。 例えば、ビデオモードの一覧をユーザに提示して、そこから選ばせるような場合です。 利用可能なビデオモードの一覧を取得するには、関数glfwGetVideoModesを使うことができます。
int count;
GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);
モニタの現在のビデオモードを取得するには、glfwGetVideoModeを呼び出してください。
const GLFWvidmode* mode = glfwGetVideoMode(monitor);

モニタの物理サイズ

モニタのミリメータ単位の物理的な大きさ、あるいはその近似値は、glfwGetMonitorPhysicalSizeで取得できます。
int widthMM, heightMM;
glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);
例えば、これによって、現在のビデオモードと合わせて、モニタのDPIを計算することができます。
const double dpi = mode->width / (widthMM / 25.4);

モニタ名

glfwGetMonitorNameでモニタ名を取得できます。
const char* name = glfwGetMonitorName(monitor);
モニタ名は、UTF–8エンコーディングのC文字列です。 モニタ名は一意とは限らないことに注意してください。

モニタのガンマランプ

モニタのガンマランプはglfwSetGammaRampでセットすることができ、モニタハンドルとGLFWgammaramp構造体へのポインタを受け付けます。
glfwSetGammaRamp(monitor, &ramp);
モニタの現在のガンマランプは、glfwGetGammaRampで受け取れます。
const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor);
一般的なガンマランプをセットしたいなら、glfwSetGammaで望みの指数からGLFWにそれを算出させることができ、それは結果のランプでglfwSetGammaRampを順に呼び出します。
glfwSetGamma(monitor, 1.0);

2014/07/20

GLFW3の新機能

V3.0の新機能

CMakeビルドシステム

以前バージョンのGLFWでは各種makefileやプロジェクトファイルを利用していましたが、それ代わって,CMakeビルドシステムを使うようになりました.CMakeはGLFWがサポートするすべてのプラットフォームで利用可能で,ほとんどのパッケージシステムで提供されており,ほとんどのメジャーな開発環境用のmakefileやプロジェクトファイルを生成できます.
CMakeの使い方に関する詳しい情報は,CMakeのマニュアルを参照してください.

マルチウィンドウサポート

GLFWは複数のウィンドウ生成をサポートしました.各ウィンドウは、それぞれがOpenGLまたはOpenGL ESコンテキストを所有し,すべてのウィンドウ関数はウィンドウハンドルを持ちます.イベントコールバックはウィンドウ毎になり,イベントを受信したウィンドウのハンドルも渡されるようになっています.与えたスレッド上の現在のコンテキストを選択するためにglfwMakeContextCurrent関数が追加されています.

マルチモニタのサポート

GLFWはマルチモニタをきちんとサポートします.glfwGetMonitorsで列挙することができ,各種の取得にはglfwGetVideoModes, glfwGetMonitorPos, glfwGetMonitorName, glfwGetMonitorPhysicalSizeを使います。また、特定のモニタにフルスクリーンウィンドウ表示するための指定が可能になっています.

Unicodeのサポート

GLFW関数へ渡されるすべての文字列引数と戻り値は,UTF-8エンコーディングを使うようになりました.(ASCIIはUTF-8のサブセットなので)拡張関数引数はもちろんのこと,ウィンドウタイトル,エラー文字列,クリップボードテキスト,モニタやジョイスティック名を含みます.

クリップボードテキストI/O

GLFWは、システムクリップボードへのプレーンテキストの書込みおよび読込みをサポートしました.これには,glfwGetClipboardString とglfwSetClipboardString関数を使います.

ガンマランプのサポート

GLFWはモニタのガンマランプの設定と読取りをサポートします.これにはglfwGetGammaRampとglfwSetGammaRamp関数を使います.ガンマ値からランプを生成して設定するglfwSetGammaもあります.
(訳注: ガンマランプとは、「各色成分の強さの段階ごとのガンマ補正後の実際に出力される強さの値」を順に並べた配列で,ガンマ補正のパラメータのようなもの,という認識です)

OpenGL ESのサポート

GLFWはOpenGL ESコンテキストの作成をサポートするようになりました.GLFW_CLIENT_APIウィンドウヒントをGLFW_OPENGL_ES_APIへセットすることによって、OpenGL ESコンテキストの生成がサポートされます.GLFWはOpenGL ES自体を実装しているわけではないので,使っているドライバがGLFWで利用できる方法のサポートを提供しなければならないことに注意してください.最近のnVIDIAとintelドライバはGLXとWGL APIを用いることでOpenGL ESコンテキストの生成をサポートしていますが,AMDはEGL実装を代わりに提供しています.

(実験的な)EGLサポート

GLFWは,CMakeオプションで選択できる,実験的なEGLコンテキスト生成バックエンドを持ちます.

高解像度モニタのサポート

GLFWはWindowsとOS Xの両方で高DPIモニタをサポートします.これは,フル解像度のフレームバッファを与えますが,他のUI要素はスケールアップされます.これを実現するために,glfwGetFramebufferSizeとglfwSetFramebufferSizeCallbackが追加されました.これらはピクセルで動作し,残りのGLFW APIはスクリーン座標で動作します.

エラーコールバック

GLFWは,より詳細な診断情報をアプリケーションへ渡せるエラーコールバックを提供するようになりました.コールバックにはエラーコードと詳細文字列が渡されます.

ウィンドウ単位のユーザポインタ

各ウィンドウはユーザ定義ポインタを持つようになりました.GLFWをC++コードへ統合するのをもっと簡単にするために,glfwGetWindowUserPointerで受け取り,glfwSetWindowUserPointerで設定します.

ウィンドウのアイコン化コールバック

各ウィンドウはアイコン化とその復元イベントのコールバックを持っています.それは glfwSetWindowIconifyCallbackで設定できます.

ウィンドウ位置コールバック

各ウィンドウは,位置イベントのコールバックを備えました.glfwSetWindowPosCallbackで設定できます.

ウィンドウ位置クエリ

ウィンドウ位置をglfwGetWindowPosで取得できるようになりました.

ウィンドウフォーカスコールバック

各ウィンドウはフォーカスイベントコールバックを備えました.glfwSetWindowFocusCallbackで設定できます.

カーソル enter/leave コールバック

各ウィンドウはマウスカーソルがクライアントエリアに入ってきた、あるいは、出て行った時のためのコールバックを持っています. glfwSetCursorEnterCallbackで設定できます.

初期ウィンドウタイトル

作成時にウィンドウタイトルを指定できるようになりました.glfwCreateWindowの引数の一つとして設定します.

隠しウィンドウ

ウィンドウはglfwHideWindowで非表示に,glfwShowWindowで表示できるようになりました.作成時の初期値として非表示にする場合は,GLFW_VISIBLEウィンドウヒントを使います.スクリーンに表示される前に指定した位置へウィンドウを動かすのと同じように,ほとんどのドライバで互換性のあるオフスクリーンレンダリングの実現方法です.

装飾なしウィンドウ

装飾(つまり,フレームやタイトルバーのようなもの)なしのウィンドウモードのウィンドウを作成できるようになりました.GLFW_DECORATEDウィンドウヒントを使います.スプラッシュスクリーンのようなものを作成できます.

修飾キービットマスク

修飾キービットマスクのパラメータが,マウスボタンコールバックとキーコールバックに追加されました.

プラットフォーム依存スキャンコード

スキャンコードパラメータがキーコールバックに追加されました.キートークンを持たないキーでも,GLFW_KEY_UNKNOWNに設定されたパラメータとして渡されて取得可能になっています.これらのスキャンコードは端末によって様々で,キーバインディングのために利用される予定です.

ジョイスティック名

ジョイスティック名をglfwGetJoystickNameで取得できるようになりました.

Doxygen ドキュメント

2014/07/05

GLFW2から3への移行ガイド 日本語訳

GLFW2から3への移行ガイド 日本語訳

Moving from GLFW 2 to 3 も翻訳しました.


目次

  • 削除された機能
    • スレッド関数
    • 画像とテクスチャのロード
    • 文字アクション
    • マウスホイール位置
    • GLFWCALLマクロ
    • Win32 MBCSのサポート
    • XP以前のWindowsバージョンのサポート
    • システム管理ホットキーのキャプチャ
    • ウィンドウオープンのパラメータ
    • イベントの自動ポーリング
    • 自動終了
    • GLUヘッダの読込み
  • 既存機能の変更
    • ウィンドウハンドル
    • マルチモニタのサポート
    • ウィンドウの終了
    • 明示的なコンテキスト管理
    • キーリビート
    • 物理キー入力
    • ジョイスティック入力
    • ビデオモードenum
    • カーソル位置
    • 永続的なウィンドウヒント
  • 名前の変更
    • ライブラリとヘッダファイル
    • 関数
    • トークン


これはGLFW2から3への移行ガイドです。 どんな変更や削除があったかを説明していますが、既存コードから新しいAPIへの移行時に必要な場合を除いて、新機能の説明しません。 例えば、GLFW3でフルスクリーンウィンドウを作成するために、新しいマルチモニタ関数の使用が必要です。

削除された機能

スレッド関数

スリープ関数を含め、スレッド関数は削除されました。 それらは、極めて原始的で、利用に際して統合化されておらず、GLFWの趣旨(すなわち、コンテキストや入力やウィンドウ)から外れ、時間を浪費します。 もっと良いスレッドライブラリがありますし、C++11やC11の両方にネイティブなスレッドサポートが利用可能で、それらは牽引を獲得しています。
もしC++11やC11の機能を使いたいけれどコンパイラがサポートしていない場合は、GLFWの原作者が作成しているTinyThread++やTinyCThreadプロジェクトを参照してください。 これらのライブラリは、C++11やC11のスレッドAPIの使いやすいサブセットを実装していて、実際にいくつかのGLFW3のテストプログラムではTinyCThreadを使っています。
とは言え、GLFW3は、GLFW2よりも良い、複数スレッドからの利用をサポートしています。 セカンダリスレッドから、コンテキストをカレントにしてレンダリングすることができ、ドキュメントには明示的に関数がセカンダリスレッドから利用できるか、メインスレッドつまりmainを呼び出すスレッドからの利用のみを想定しているかを記述しています。

画像とテクスチャのロード

画像とテクスチャのロード関数は削除されました。 Targa画像フォーマットのみがサポートされており、それらのほとんどが初級者レベルのサンプルに利用されています。 GLFW3でそれらを十分高い品質を保証するためには、他のフォーマットをサポートするだけでなく、OpenGLのテクスチャ機能への現代的な拡張も必要です。 それには、外部依存関係(libjpegやlibpngなど)を数多く追加したり、これらのライブラリのバージョンを固定してGLFWを出荷しなければなりません。
それを実現するためのライブラリが既にあり、この作業を重複することやGLFWへこの複製を紐付けることは不必要であると思います。 freeglutのようなGLFWに似たプロジェクトは、それらのライブラリから得ることもできます、そして、GLFWはOpenGLや標準入出力のようにどこでも利用可能であるためには、それらのライブラリのプラットフォーム依存の部分があってはいけません。

文字アクション

文字列コールバックのアクションパラメータは削除されました。これは、元々のGLFW、つまりスウェーデン人によって英国で開発していた時からありました。 けれど、多くのキーボードレイアウトでは、ダイアクリティカルマーク(発音記号)を入力するのに1つ以上のキーが必要です。 スウェーデン語キーボードでさえ、üのような稀なケースで同時押しが必要です。
文字列コールバックのアクション引数だけの削除であり、文字列コールバック自体の削除ではないことに注意してください。

マウスホイール位置

glfwGetMousWheel関数は削除されました。 スクロールイベントは絶対的な状態を表現しませんが、代わりに文字列入力のような相対的な状態変化を解釈します。 よって、文字列入力と同様に、返すための正常な“現在の状態”はありません。 マウスホイールコールバックは、スクロールコールバックに置き換えられ、2軸のスクロール量を受け取れます。

GLFWCALLマクロ

Windowsで__stdcallを使うコールバック関数を作成するGLFWCALLマクロは削除されました。 GLFWはCで書かれていて、Pascalではありません。 このマクロの削除は、GLFWユーザが覚えておくべき事項、つまり、すべてのコールバック関数をGLFWCALLでマークする必要があること、が1つ減ることを意味します。 DLLとDLLリンクライブラリの作成も単純化し、明示的に@nエントリポイント接尾語を無効にする必要がなくなります。

Win32 MBCSのサポート

GLFW3のWin32版は、MBCSモードでコンパインできなくなります。 しかし、Win32 APIのUnicode版を使えば処理全体にはまったく影響しませんし、それを用いてウィンドウ作成するだけで、同じアプリケーションの他の箇所からMBCS関数を呼び出すことも完璧にできます。 したがって、MBCSモードのコードを持つGLFWを用いたアプリショーションがあっても、GLFW自体がそれをサポートする必要はありません。

XP以前のWindowsバージョンのサポート

XP以前のWindowsバージョンの明示的なサポートは削除されました。 これらの以前のバージョンでGLFW3を動かすことを妨げるようなコードはありませんが、それらのバージョンにないWin32関数を使っています。
WindowsXPは2001年にリリースされ、現在(2013年)までにそれ以前のすべてのバージョンのWindowsを置き換えましたが、今は急速にWindows7や8に切り替えられつつあります。 MSDNライブラリはWindows2000以前のバージョンのドキュメントを既に提供していませんので、たとえ努力する価値があったとしても、これらのバージョンとの互換性を維持するのが困難になっています。
Win32 APIはまだ残っていますし、GLFW3はWindowsXP以降で利用可能な関数のみを使っています。 (Windows95をまだサポートしているGLFW2から見て新しい)XP以前のOSをサポートするとしても、最近のWindowsバージョンだけで用意されている多くの関数のためにランタイムチェックが必要となってしまいます。

システム管理ホットキーのキャプチャ

ALT+TABのようなシステム管理ホットキーを無効化して取得する機能は削除されました。 ゲームや科学的な可視化やそれ以外であっても、モダンなアプリケーションは行儀の良いデスクトップ市民であることが望まれていて、フルスクリーンモードで動作している時でさえ、これらのホットキーが機能することを期待されています。

ウィンドウオープンのパラメータ

GLFW_OPENEDウィンドウパラメータは削除されました。 ウィンドウオブジェクトが存在している限り、ウィンドウは“open”です。 ユーザがウィンドウを閉じようとしたことを検知するためには、glfwWindowShouldCloseと閉じるコールバックを参照してください。

イベントの自動ポーリング

GLFW3は、glfwSwapBuffers上でイベントの自動ポーリングを行いません。これはglfwPollEventsまたはglfwWaitEventを自分で呼び出す必要があることを意味します。 バッファスワップと異なり、イベント処理関数はすべてのウィンドウで1度だけ実行されます。

自動終了

GLFW3は、初期化時に、atexitにglfwTerminateを登録しません。 したがって、GLFWが確保したすべてのリソースを適切に解放するには、glfwTerminateを終了前に自分で呼び出さなければなりません。

GLUヘッダの読込み

GLFW3は、GLUヘッダをデフォルトでインクルードしなくなり、GLU自体が非推奨になっています。ですが、GLFW3ヘッダのインクルード前にGLFW_INCLUDE_GLUを定義しておくことで、GLFW3ヘッダがGLUをインクルードするようにできます。

既存機能の変更

Window handlesウィンドウハンドル

GLFW3はマルチウィンドウをサポートしているので、ウィンドウハンドル引数がすべてのウィンドウ関連GLFW関数とコールバックに追加されました。 新しく作成したウィンドウのハンドルは、glfwCreateWindow(以前はglfwOpenWindow)によって返されます。 ウィンドウハンドルはGLFWWindow*型で、つまり、不透明な(訳注:opaque = 実装が隠蔽された)構造体へのポインタです。

マルチモニタのサポート

GLFW3はマルチモニタサポートを提供し、GLFWmonitor*ハンドル型と関連する関数群が追加されています。 フルスクリーンモードのウィンドウを要求するには、GLFW_FULLSCREENを渡す代わりに、そのウィンドウでどのモニタを使うかを指定します。 GLFW2と同様の振る舞いを提供するために、glfwGetPrimaryMonitorがあります。

ウィンドウの終了

ウィンドウの終了は、他と同様にユーザがイベントイベントを引き起こすことで始まります。 GLFW2と異なり、GLFW3で作成されたウィンドウとコンテキストは、足元から消えたりしません。 各ウィンドウは閉じるフラグを持つようになり、それはユーザがそのウィンドウを閉じようとした時にセットされます。 デフォルトでは、何もせず、ウィンドウは開いたままで見えた状態を維持します。 そこで、そのウィンドウを破棄する、他のアクションをする、あるいはその要求を単に無視するといった処理を自分で行います。 閉じるフラグの状態をglfwWindowShouldCloseで取得することや、いつでもglfwSetWindowShouldCloseを使ってフラグをセットすることが可能です。
閉じるコールバックは、値を返さなくなりました。 代わりに、閉じるフラグがセットされた直後に呼び出されます。そして、その値を上書きすることもできます。そうする場合は、イベント処理が完了する前にそれを行います。 しかしながら、閉じるコールバックの中で(あるいは、他のウィンドウ関連コールバックで)、glfwDestoryWindowを呼び出せないかも知れません。
GLFW自体は閉じるフラグをクリアすることはありませんが、実装者はウィンドウを閉じるためにいくつかの理由でそれをセットすることが許可されています。例えば、ユーザがメインメニューから終了を選択した場合などです。

明示的なコンテキスト管理

各GLFW3ウィンドウはOpenGLコンテキストを所有しており、実装者とユーザだけが、どんなときでもスレッド上でどのコンテキストがカレントになっているべきかを知っています。 したがって、GLFW3は、そのコンテキストがいつカレントになって、いつカレントじゃなくなるか、を仮定しません。それを決定するのはあなたです。
これは、他のことと合わせて、ウィンドウを作成した後で、OpenGL関数を呼出す前に、glfwMakeContextCurrentを呼出す必要があることを意味しています。

キーリピート

GLFW_KEY_REPEATの有効化は削除され、キーリピートはキーと文字列の両方で常に有効にになっています。 キーコールバックでリピートの中から最初のキー押下を区別するために、新しいキーアクションGLFW_REPEATが追加されました。 glfwGetKeyはGLFW_PRESSまたはGLFW_RELEASEのどちらかだけを返すままであることに注意してください。

物理キー入力

GLFW2では現在のキーボード配列によって生成された値になっていましたが、それと異なり、GLFW3のキートークンは物理キーにマッピングされています。 そのトークンは、標準US配列のキーボードを用いた値と対応する名前が付けられていますが、これは便利なだけでなく、ほとんどのプログラマがキー配列を知っていると仮定されています。
(例として) GLFW_KEY_LEFT_BRACKETは常に単一のキーであり、ユーザが使うキーボード配列がどんなものでも、同じ位置にある同じキーだということを意味しています。
キー入力機器は必ずしもテキストを入力することを意味しません、GLFW2ではとりあえず動いていたのでその方法を使っていましたけれど。 テキスト入力のためにそれを使っているなら、GLFW2でも3でも、文字列入力コールバックを使わなければなりません。 押下されたキーではなく、入力された文字列が取得できます。
GLFW3では、標準的な105キーのキーボードにおけるすべてのキーのトークンが用意されていますので、文字の ’a’や’A’をチェックする代わりに、GLFW_KEY_Aをチェックしてください。

ジョイスティック入力

glfwGetJoystickPos関数はglfwGetJoystickAxesへ名前が変更されました。
glfwGetJoystickParam関数とGLFW_PRESENT、GLFW_AXES、GLFW_BUTTONSトークンは、glfwJoystickPresent関数、軸とボタンカウントを返すglfwGetJoystickAxes関数とglfwGetJoystickButtons関数に置き換えられました。

ビデオモードenum

ビデオモードenumはモニタごとの値になっています。 glfwGetVideoModes関数は、必要な配列の大きさがどれくらいかを推定する必要はなく、指定したモニタのすべての利用可能なモードを返します。 貧弱な定義された挙動をしていたglfwGetDesktopMode関数は、glfwGetVideoMode関数に変更されています。 それは、現在のモニタのモードを返します。

カーソル位置

GLFW3は、ウィンドウがアクティブな場合だけglfwSetCursorPos (以前は glfwSetMousePos)を用いて、ウィンドウ上のカーソルの位置を設定することだけが可能です。 ウィンドウがアクティブになっていない場合は、この関数は暗黙的に失敗します。

永続的なウィンドウヒント

ウィンドウヒントはウィンドウ作成時のデフォルト値へリセットされなくなりましたが、代わりに、glfwWindowHint(以前はglfwOpenWindowHint)やglfwDefaultWindowHintsによって変更されるまで、あるいはライブラリが終了して再度初期化されるまで、それらの値が維持されます。

名前の変更

ライブラリとヘッダファイル

メジャーバージョンのヘッダとの衝突を避けるため、GLFW3ヘッダはglfw3。hという名前になってGLFWディレクトリへ移動されました。 同様に、GLFW3ライブラリはglfw3という名前になっています。ただし、Unix-likeなシステムの共有ライブラリとしてインストールされた場合を除きます。その場合はlibglfw。so。3というso名が利用されます。

関数

GLFW 2 GLFW 3 Notes
glfwOpenWindow glfwCreateWindowすべてのチャンネルビット深度はヒントになりました
glfwCloseWindow glfwDestroyWindow
glfwOpenWindowHint glfwWindowHintすべてのGLFW_*_BITSトークンを受け付けるようになりました
glfwEnable glfwSetInputMode
glfwDisable glfwSetInputMode
glfwGetMousePos glfwGetCursorPos
glfwSetMousePos glfwSetCursorPos
glfwSetMousePosCallback glfwSetCursorPosCallback
glfwSetMouseWheelCallback glfwSetScrollCallback2軸のスクロールオフセットをdouble型で受け取ります
glfwGetJoystickPos glfwGetJoystickAxes
glfwGetWindowParam glfwGetWindowAttrib
glfwGetGLVersion glfwGetWindowAttribGLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINORGLFW_CONTEXT_REVISION を使います
glfwGetDesktopMode glfwGetVideoMode現在のモニタモードを返します
glfwGetJoystickParam glfwJoystickPresent軸とボタン数は glfwGetJoystickAxes とglfwGetJoystickButtons によって提供される

トークン

GLFW 2 GLFW 3 Notes
GLFW_OPENGL_VERSION_MAJOR GLFW_CONTEXT_VERSION_MAJOR OpenGL ES にも適用するために名前を変更
GLFW_OPENGL_VERSION_MINOR GLFW_CONTEXT_VERSION_MINOR OpenGL ES にも適用するために名前を変更
GLFW_FSAA_SAMPLES GLFW_SAMPLES OpenGL API に沿って名前を変更
GLFW_ACTIVE GLFW_FOCUSED ウィンドウフォーカスコールバックに合わせて名前を変更
GLFW_WINDOW_NO_RESIZE GLFW_RESIZABLE デフォルトを逆にした
GLFW_MOUSE_CURSOR GLFW_CURSOR glfwSetInputModeで利用される
GLFW_KEY_ESC GLFW_KEY_ESCAPE
GLFW_KEY_DEL GLFW_KEY_DELETE
GLFW_KEY_PAGEUP GLFW_KEY_PAGE_UP
GLFW_KEY_PAGEDOWN GLFW_KEY_PAGE_DOWN
GLFW_KEY_KP_NUM_LOCK GLFW_KEY_NUM_LOCK
GLFW_KEY_LCTRL GLFW_KEY_LEFT_CONTROL
GLFW_KEY_LSHIFT GLFW_KEY_LEFT_SHIFT
GLFW_KEY_LALT GLFW_KEY_LEFT_ALT
GLFW_KEY_LSUPER GLFW_KEY_LEFT_SUPER
GLFW_KEY_RCTRL GLFW_KEY_RIGHT_CONTROL
GLFW_KEY_RSHIFT GLFW_KEY_RIGHT_SHIFT
GLFW_KEY_RALT GLFW_KEY_RIGHT_ALT
GLFW_KEY_RSUPER GLFW_KEY_RIGHT_SUPER
Last update on Wed Nov 20 2013 for GLFW 3.0.4

2014/06/28

GLFW3 Getting Started 日本語訳

GLFW3 Getting Started 日本語訳

GLFW: Getting Startedの勝手な日本語翻訳です.GLFWを使い始める方は目を通しておくとよいでしょう.これを読めば,GLFWの大まかな使い方はわかるかと思います.
あ,オリジナル文書に用意されているリンクは機能してません><


目次

  • GLFWヘッダのインクルード
  • GLFWの初期化と終了
  • エラーコールバックの設定
  • ウィンドウとコンテキストの作成
  • OpenGLコンテキストをカレントにする
  • ウィンドウの閉じるフラグのチェック
  • 入力イベントの受信
  • OpenGLによるレンダリング
  • タイマーの読み取り
  • バッファのスワップ
  • イベント処理
  • 書いてみよう: 小さなGLFWアプリケーション


このガイドは、GLFW3を用いたシンプルなOpenGLアプリケーションを作る方法を解説します。 ここでは、最も頻繁に利用される幾つかの機能を紹介しますが、それら以外にも多くの機能が存在します。 GLFW関数の詳細なドキュメントを見る場合は、関数名をクリックしてください(訳注:リンクしてません:-().
このガイドは、以前のバージョンのGLFWを使った経験がない方を対象としています。 もしGLFW2を使ったことのある方は、移行ガイド日本語訳)もご覧ください。

GLFWヘッダのインクルード

プログラムのOpenGLやGLFWを使うファイルでは、GLFW3ヘッダファイルをインクルードする必要があります。

#include <GLFW/glfw3.h>

これはGLFWのAPIの全ての定数、型、関数プロトタイプを定義します。 また、OpenGLヘッダもインクルードされ、プラットフォームで動作させるのに必要な全ての定数と型が定義されます。
例えば、Windowsでは通常GL/gl.hをインクルードする前に、windows.hをインクルードする必要があります。これは、ソースファイルがWindowsに紐付けられて、コードの名前空間がWin32APIに汚染されます。
その代わりに、GLFWヘッダがそれを行いますが、windows.hをインクルードするのではなく、その必要部分だけを複製することで処理します。 これは必要な場合にだけ実施されるので、もしwindows.hをインクルード済みであればGLFWヘッダはそれらのシンボルの再定義は行いません。

つまり:
  • 自分でOpenGLヘッダをインクルードしないこと。GLFWが行います。
  • windows.hあるいはプラットフォーム固有のヘッダは、それらのAPIを直接利用するまでインクルードしないこと。
  • それらのヘッダが必要になった場合は、GLFWヘッダをインクルードする前にインクルードすること。GLFWはこれを検出する。
バージョン3.0からは、GLUヘッダglu.hはデフォルトでインクルードされなくなりました。 もしインクルードしたい場合は、GLFW_INCLUDE_GLUをGLFWヘッダのインクルードの前に定義してください。


#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>

GLFWの初期化と終了

GLFWの機能を使う前に、ライブラリを初期化しなければなりません。 これは、glfwInitで実行され、成功したなら非ゼロ、エラーが発生した場合はゼロを返します。

if (!glfwInit())
    exit(EXIT_FAILURE);

GLFWを使用しているときは、通常、プログラムの最後にglfwTerminateを呼び出す必要があります。

glfwTerminate();

これは、すべての残っているウィンドウを破棄して、すべての他のリソースを解放します。 これの呼出した後は、GLFW機能を利用する前に、再度glfwInitを呼び出す必要があります。

エラーコールバックの設定

ほとんどのイベント(キーが押されたとか、GLFWウィンドウが移動したとか、エラーが発生しているとか)は、コールバックを介して報告されます。 コー​​ルバックは単なるCの関数(またはC++の静的メソッド)で、イベントに関する引数を持ってGLFWによって呼び出されます。
glfwInitまたはその他GLFW関数が失敗した場合、GLFWエラーコールバックにエラーがレポートされます。 エラーコールバックを設定することで、これらのレポートを受け取ることができます。 コー​​ルバック関数自体はGLFWerrorfunのシグネチャと一致する必要があります。 ここに挙げるのは、単にstderrにエラーの説明を出力する単純なエラーコールバックです。

void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}

コールバックを設定することで、GLFWはそれを呼び出せることを知らせるには、glfwSetErrorCallbackを使います。 これは、glfwInitより前に呼び出すことのできるGLFW関数のひとつで、初期化中にエラーが発生を通知を受け取るために、他のGLFWを使う前に設定するべきです。

glfwSetErrorCallback(error_callback);

ウィンドウとコンテキストの作成

ウィンドウ (とそのコンテキスト)glfwCreateWindowで作成され、作成されたウィンドウハンドルを返します。 例えば、640x480のウィンドウモードのウィンドウを作成するには次のようにします:

GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);

ウィンドウ作成に失敗した場合は、NULLが返されるので、それを確認する必要があります。

if (!window)
{
    glfwTerminate();
    exit(EXIT_FAILURE);
}

このハンドルは、すべてのウィンドウ関連関数に渡され、入力イベントと共に提供されるので、どのウィンドウがその入力を受け取ったかを知ることができます。
フルスクリーンウィンドウを作成するには、どのモニタにそのウィンドウを表示するかを指定する必要があります。 ほとんどの場合、ユーザのプライマリモニタを選ぶのが良いです。 glfwGetPrimaryMonitorを使うとプライマリモニタを取得できます。 上述のウィンドウをフルスクリーンにするには、単にモニタハンドルを渡すだけです:

GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL);

フルスクリーンウィンドウは、モニタの表示エリア全体をカバーし、境界や装飾を持たず、そして、モニタの解像度を要求したウィンドウサイズに最も近いものに変更します。
そのウィンドウを使い終えた時は、glfwDestroyWindow関数でウィンドウを破棄します。

glfwDestroyWindow(window);

この関数が一度呼び出されたら、そのウィンドウにはそれ以上イベントが届けられなくなり、そのハンドルは無効になります。

OpenGLコンテキストをカレントにする

OpenGLのAPIを使う前に、OpenGLコンテキストを取得しなければなりません。 ウィンドウのコンテキストをglfwMakeContextCurrentを用いてカレントにします。 他のコンテキストをカレントにするまで、あるいはコンテキストを所有するウィンドウが破棄されるまで、カレントコンテキストのままになります。

glfwMakeContextCurrent(window);


ウィンドウ閉じるフラグのチェック

各ウィンドウは、そのウィンドウが閉じられるべきであるかを示すフラグを持っています。 このフラグは、glfwWindowShouldCloseでチェックすることができます。
ユーザが、タイトルバーの閉じるボタンを押す、あるいはAlt+F4のようなショートカットで、ウィンドウを閉じようとした時、このフラグは1にセットされます。 その際、実際にはウィンドウはまだ閉じられていないことに注意してください。このフラグをモニタリングすることで、ウィンドウを破棄するか、ユーザに何らかのフィードバックを与えることができます。

while (!glfwWindowShouldClose(window))
{
    // Keep running
}

glfwSetWindowCloseCallbackでクローズコールバックを設定することで、ユーザがウィンドウを閉じようとした時に通知を受け取ることができます。 そのコールバックはクローズフラグがセットされた直後に呼び出されます。
glfwSetWindowShouldCloseを用いて、自分自身でそれをセットすることも可能です。 これは他の入力をウィンドウを閉じるに変換したいとき、例えば、エスケープキーの押下で閉じるようにしたいときに便利です。

入力イベントの受信

各ウィンドウは、すべての様々な種類のイベントを受け取るために設定できるコールバックを数多く持っています。 キー押下、押下解除イベントを受け取るには、glfwSetKeyCallbackでキーコールバックを設定します。

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

イベント発生時に実際に呼び出されるイベントコールバックに、上述したようなイベント処理が必要です。

OpenGLによるレンダリング

カレントOpenGLコンテキストを取得したあとは、OpenGLを普通に使えます。 このチュートリアルでは、多色の回転する三角形をレンダリングしてみます。 この例ではglViewportglOrthoで必要とされるフレームバッファのサイズは、glfwGetFramebufferSizeで受け取ることができます。

int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);

しかし、コールバックglfwSetFramebufferSizeCallbackを用いて、そこでglViewportを呼ぶことで、フレームバッファサイズを設定することも可能です。

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

タイマーの読み取り

三角形を適切に回転させるには、時間の情報源が必要です。 GLFWは、glfwInitからの経過秒数をdouble型で返すglfwGetTimeを提供しています。 時間の情報源は各プラットフォームにおける最も精確なものが利用され、一般にはマイクロ秒あるいはナノ秒の分解能を持っています。

double time = glfwGetTime();

バッファのスワップ

GLFWウィンドウは常にダブルバッファリングを使います。 2つのレンダリングバッファを持つことを意味しています; フロントバッファとバックバッファ。 フロントバッファは画面に表示されているもので、バックバッファはレンダリングの対象のものです。
フレーム全体のレンダリングが完了した時、レンダリングしたフレームを表示し、そして、新しいフレームのレンダリングを開始するために、バックとフロントを入れ替えます。 これはglfwSwapBuffersで行えます。

glfwSwapBuffers(window);

イベント処理

GLFWは、イベントの受け取りのため、および、ロックされていないことを示すための両方の目的のために、ウィンドウシステムと定期的に通信する必要があります。 イベント処理は定期的に行う必要があり、通常、各フレームのレンダリングの前にとバッファスワップの後に行われます。
保留中のイベントを処理する方法は2つあります。 glfwPollEventsはそれらの受信済みイベントだけを処理して、すぐにリターンします。 これは、ほとんどのゲームが行うように継続的にレンダリングする場合に最良のチョイスです。

glfwPollEvents();

新しい入力を受け取ったときにだけレンダリングの更新が必要な場合は、代わりに、glfwWaitEventsを使うのがベターです。 それは、少なくとも1つのイベントが受信されるまで待ち、その間はスレッドをスリープしておき、それから、glfwPollEventsが行うようにすべての受信イベントを処理します。 この方法は、CPUサイクルをかなり抑えることができ、例えば、いろんなエディットツールにおいて有用です。

glfwWaitEvents();


書いてみよう: 小さなGLFWアプリケーション

いま、GLFWを初期化し、ウィンドウを作成し、キーボード入力を取得する方法がわかったので、シンプルなプログラムを作成できるようになりました。

#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
static void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    while (!glfwWindowShouldClose(window))
    {
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
        glBegin(GL_TRIANGLES);
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(-0.6f, -0.4f, 0.f);
        glColor3f(0.f, 1.f, 0.f);
        glVertex3f(0.6f, -0.4f, 0.f);
        glColor3f(0.f, 0.f, 1.f);
        glVertex3f(0.f, 0.6f, 0.f);
        glEnd();
        glfwSwapBuffers(window);
        glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
    exit(EXIT_SUCCESS);
}


このプログラムは、640x480のウィンドウモードの画面を作成してから、スクリーンの消去、三角形のレンダリング、イベント処理のループを、ウィンドウがユーザに閉じるまで行います。 これはソースコード配布のexamples/simple.cにあり、GLFWをビルドする時に、デフォルトで他のサンプルと一緒にコンパイルされます。
コンパイル GLFWを使うプログラムをコンパイル・リンクする方法について知りたい場合は、Building programs that use GLFWを参照してください。


2014/05/17

glfw3の使い方(VS2013)

目的

glutがいけてないので,glfwを使ったOpenGLウィンドウの作り方をメモする.
久しぶりのウィンドウズ環境なので,いろいろ戸惑ったりすると思うので,備忘録として.

glfw3を静的ライブラリとして使う.

開発環境

  • Visual C++2013 Express Edition
  • Windows 8.1 (64bit)

準備

  1. glfw3をダウンロード,配置
  2. VCプロジェクトの作成
  3. プロジェクトの設定


glfw3をダウンロード,配置

GLFWのダウンロードページ へ行って「Windows pre-compiled binaries」からダウンロードします.
  http://www.glfw.org/download.html
2つのパッケージがあるので,32bitか64bitの適切な方を選びましょう.
あとで作るVC++のプロジェクト設定にも関係するので,あとで決める,どっちも使うかも,という場合は,両方ダウンロードしちゃいましょう.

ダウンロードした「glfw-3.0.4.bin.WIN32.zip」か「glfw-3.0.4.bin.WIN64.zip」を解凍します.
解凍したファイルの中を次のようなライブラリ用のフォルダに配置します.以下の例は,私の場合の配置場所になっていますので,分かっている人はイイ感じのところにおいてください.
(※ VSから参照できる場所(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl とか)に置いてもいいんですが,私の個人的なルールに従い別の場所に置きます)

こういう構成のフォルダを作ってあります:
c:\
  └ usr\
  └ local\
    └include\
    └lib32\
    └lib64\

解凍ファイル内のincludeフォルダ内のGLFWフォルダを,上記includeにコピー.
lib-msvc120内のファイルをlib32またはlib64へコピーします.

osxならhomebrewで勝手に入ってくれて楽ちんなんですけどね...
nuGetでも入れられるようですが.


VCプロジェクトの作成

「ファイル」-「新しいプロジェクト」から,「Win32 コンソール アプリケーション」を作成.

プロジェクトの設定

メニュー「プロジェクト」-「~~のプロパティ」
構成プロパティの「VC++ディレクトリ」に,includeディレクトリとlibディレクトリへのパスを追加する.
ここで,$(PlatformArchitecture)を用いて,lib32とlib64が自動的に切り替わるようにしておくと32bitと64bitを気軽にスイッチできる.

インクルード ディレクトリ: C:\usr\local\include
ライブラリ ディレクトリ: C:\usr\local\lib$(PlatformArchitecture)
「親を継承」的なチェックボックスはON.



さらに,続けてライブラリも設定する.
「リンカー」「入力」の「追加の依存ファイル」にライブラリファイルを追加.
opengl32.lib;glfw3.lib



サンプルを動かす

#include <GLFW/glfw3.h>
int main(void)
{
    GLFWwindow* window;
    /* Initialize the library */
    if (!glfwInit())
        return -1;
    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }
    /* Make the window's context current */
    glfwMakeContextCurrent(window);
    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        /* Swap front and back buffers */
        glfwSwapBuffers(window);
        /* Poll for and process events */
        glfwPollEvents();
    }
    glfwTerminate();
    return 0;
}
(http://www.glfw.org/documentation.html のExample Codeから)

あとはビルドしてウィンドウが表示されることを確認しておしまい.

参考