文書の出典
- 出典
- GLFW 3.5.1 Documentation
- 上流バージョン
- GLFW 3.5.1
- 文書状態
- 翻訳
このページは、GLFW 3.5.1 公式ドキュメントを改変して Markdown 化したものです。libx 向けに書式、ナビゲーション、リンクを変更していますが、技術的な内容は GLFW 3.5.1 のソース配布物に基づいています。
ウィンドウガイド
このガイドでは、ウィンドウに関連する GLFW の関数を紹介します。この分類の特定の関数について詳しくは、windowを参照してください。GLFW のほかの領域についてもガイドがあります。
ウィンドウオブジェクト
GLFWwindow オブジェクトは、ウィンドウとコンテキストの両方を内包します。glfwCreateWindow で作成し、glfwDestroyWindow で破棄します。残っている場合は glfwTerminate でも破棄されます。ウィンドウとコンテキストは分離できない形で結び付いているため、オブジェクトポインターはコンテキストとウィンドウの両方のハンドルとして使われます。
ウィンドウ関連の各コールバックへ渡されるイベントストリームを確認するには、events テストプログラムを実行してください。
ウィンドウを作成する
ウィンドウとその OpenGL または OpenGL ES コンテキストは glfwCreateWindow で作成します。この関数は作成したウィンドウオブジェクトのハンドルを返します。たとえば、次のコードは 640×480 のウィンドウモードのウィンドウを作成します。
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);ウィンドウの作成に失敗すると NULL が返るため、戻り値を確認する必要があります。
ウィンドウハンドルは、ウィンドウ関連のすべての関数へ渡します。また、すべての入力イベントとともに渡されるため、イベントハンドラーはどのウィンドウがイベントを受け取ったか判断できます。
フルスクリーンウィンドウ
フルスクリーンウィンドウを作成するには、ウィンドウが使うモニターを指定する必要があります。多くの場合は、ユーザーのプライマリモニターが適切です。モニターの取得について詳しくは、monitor_monitorsを参照してください。
GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonitor(), NULL);フルスクリーンウィンドウはモニターの表示領域全体を覆い、境界線や装飾を持ちません。
ウィンドウモードのウィンドウは、glfwSetWindowMonitor でモニターを設定するとフルスクリーンにできます。フルスクリーンウィンドウは、同じ関数でモニターの設定を解除するとウィンドウモードにできます。
GLFWvidmode 構造体の各フィールドは関数引数またはウィンドウヒントに対応し、組み合わせてそのウィンドウの_希望するビデオモード_を構成します。ウィンドウが入力フォーカスを持つ間、希望するビデオモードに最も近い、サポートされているビデオモードが選択したモニターに設定されます。ビデオモードの取得について詳しくは、monitor_modesを参照してください。
| ビデオモードのフィールド | 対応先 |
|---|---|
| GLFWvidmode.width | glfwCreateWindow の width 引数 |
| GLFWvidmode.height | glfwCreateWindow の height 引数 |
| GLFWvidmode.redBits | GLFW_RED_BITS ヒント |
| GLFWvidmode.greenBits | GLFW_GREEN_BITS ヒント |
| GLFWvidmode.blueBits | GLFW_BLUE_BITS ヒント |
| GLFWvidmode.refreshRate | GLFW_REFRESH_RATE ヒント |
フルスクリーンウィンドウを作成した後は、glfwSetWindowMonitor で解像度、リフレッシュレート、モニターを変更できます。解像度だけを変更する場合は glfwSetWindowSize も使えます。いずれの場合も、新しいビデオモードは glfwCreateWindow が選ぶビデオモードと同じ方法で選択されます。ウィンドウが OpenGL または OpenGL ES コンテキストを持つ場合、そのコンテキストは影響を受けません。
デフォルトでは、ウィンドウが入力フォーカスを失うと、ユーザーがデスクトップへ戻れるように、モニターの元のビデオモードが復元され、ウィンドウがアイコン化されます。複数のモニターをフルスクリーンウィンドウで同時に覆う場合などは、GLFW_AUTO_ICONIFY ウィンドウヒントでこの動作を無効にできます。
モニターが切断されると、そのモニター上でフルスクリーンになっているすべてのウィンドウはウィンドウモードへ切り替わります。詳しくは monitor_eventを参照してください。
「ウィンドウ化フルスクリーン」ウィンドウ
希望するビデオモードに最も近いものが現在のビデオモードであれば、ビデオモードは変更されません。これによりウィンドウ作成が高速になり、アプリケーションの切り替えもはるかに滑らかになります。これは_ウィンドウ化フルスクリーン_または_ボーダーレスフルスクリーン_ウィンドウと呼ばれることがあり、フルスクリーンウィンドウとして扱われます。このようなウィンドウを作成するには、現在のビデオモードを要求します。
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwWindowHint(GLFW_RED_BITS, mode->redBits);
glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "My Title", monitor, NULL);これは、ウィンドウモードからフルスクリーンへ切り替えるウィンドウでも機能します。
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);glfwGetVideoMode はモニターの_現在の_ビデオモードを返すことに注意してください。そのモニター上にある既存のフルスクリーンウィンドウをウィンドウ化フルスクリーンにする場合は、あらかじめデスクトップの解像度を保存しておく必要があります。
ウィンドウを破棄する
ウィンドウが不要になったら、glfwDestroyWindow で破棄します。
glfwDestroyWindow(window);ウィンドウの破棄は常に成功します。実際に破棄する前にすべてのコールバックが解除されるため、そのウィンドウへ以後イベントが配信されることはありません。glfwTerminate の呼び出し時に残っているすべてのウィンドウも破棄されます。
フルスクリーンウィンドウを破棄すると、モニターの元のビデオモードは復元されますが、ガンマランプは変更されたままです。
ウィンドウ作成ヒント
ウィンドウとコンテキストを作成する前に設定できるヒントがいくつかあります。ウィンドウ自体に影響するものも、フレームバッファまたはコンテキストに影響するものもあります。ライブラリを glfwInit で初期化するたびに、これらのヒントはデフォルト値へ設定されます。整数値のヒントは glfwWindowHint、文字列値のヒントは glfwWindowHintString で個別に設定できます。glfwDefaultWindowHints を使うと、すべてを一度にデフォルト値へ戻せます。
一部のヒントはプラットフォーム固有です。どのプラットフォームでも常に設定できますが、対応するプラットフォームだけに影響し、ほかでは無視されます。設定にプラットフォーム固有のヘッダーや呼び出しは必要ありません。
注: 指定した属性を持たせるウィンドウとコンテキストを作成する前に、ウィンドウヒントを設定する必要があります。ヒントは glfwCreateWindow への追加引数として機能します。
ハード制約とソフト制約
一部のウィンドウヒントはハード制約です。ウィンドウとコンテキストの作成を成功させるには、利用可能な機能と_正確に_一致しなければなりません。ハード制約ではないヒントは可能な限り近いものと照合されますが、作成されるコンテキストとフレームバッファは、ヒントで要求した内容と異なる可能性があります。
次のヒントは常にハード制約です。
次の追加ヒントは、OpenGL コンテキストを要求する場合はハード制約ですが、OpenGL ES コンテキストを要求する場合は無視されます。
ウィンドウ関連のヒント
GLFW_RESIZABLE は、ウィンドウモードのウィンドウを_ユーザーが_サイズ変更できるかどうかを指定します。glfwSetWindowSize 関数を使えば、引き続きウィンドウのサイズを変更できます。指定できる値は GLFW_TRUE と GLFW_FALSE です。フルスクリーンウィンドウと装飾のないウィンドウでは、このヒントは無視されます。
GLFW_VISIBLE は、ウィンドウモードのウィンドウを最初から表示するかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。フルスクリーンウィンドウでは無視されます。
GLFW_DECORATED は、ウィンドウモードのウィンドウに境界線や閉じるボタンなどのウィンドウ装飾を付けるかどうかを指定します。装飾のないウィンドウをユーザーがサイズ変更することはできませんが、一部のプラットフォームでは引き続きクローズイベントを発生させられます。指定できる値は GLFW_TRUE と GLFW_FALSE です。フルスクリーンウィンドウでは無視されます。
GLFW_FOCUSED は、作成時にウィンドウモードのウィンドウへ入力フォーカスを与えるかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。フルスクリーンウィンドウと最初から非表示のウィンドウでは無視されます。
GLFW_AUTO_ICONIFY は、フルスクリーンウィンドウが入力フォーカスを失ったときに、自動的にアイコン化して以前のビデオモードを復元するかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。ウィンドウモードのウィンドウでは無視されます。
GLFW_FLOATING は、ウィンドウモードのウィンドウをほかの通常のウィンドウより前面に浮かせるかどうかを指定します。これは topmost または always-on-top とも呼ばれます。主にデバッグ目的の機能であり、正しいフルスクリーンウィンドウの実装には使えません。指定できる値は GLFW_TRUE と GLFW_FALSE です。フルスクリーンウィンドウでは無視されます。
GLFW_MAXIMIZED は、ウィンドウモードのウィンドウを最大化した状態で作成するかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。フルスクリーンウィンドウでは無視されます。
GLFW_CENTER_CURSOR は、新しく作成したフルスクリーンウィンドウの中央へカーソルを移動するかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。ウィンドウモードのウィンドウでは無視されます。
GLFW_TRANSPARENT_FRAMEBUFFER は、ウィンドウのフレームバッファを透明にするかどうかを指定します。有効であり、システムがサポートしている場合、ウィンドウのフレームバッファのアルファチャンネルを使って、フレームバッファと背景を合成します。ウィンドウ装飾には影響しません。指定できる値は GLFW_TRUE と GLFW_FALSE です。
GLFW_FOCUS_ON_SHOW は、glfwShowWindow の呼び出し時にウィンドウへ入力フォーカスを与えるかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。
GLFW_SCALE_TO_MONITOR は、コンテンツスケールの変化に基づいてウィンドウのコンテンツ領域をサイズ変更するかどうかを指定します。コンテンツスケールは、ユーザーのシステム全体の設定変更や、異なるスケール設定を持つモニターへのウィンドウ移動によって変化します。
このヒントが効果を持つのは、Windows や X11 のようにスクリーン座標とピクセルが常に 1:1 で対応するプラットフォームだけです。macOS などでは、フレームバッファの解像度がウィンドウサイズとは独立して変化できます。
GLFW_SCALE_FRAMEBUFFER は、コンテンツスケールの変化に基づいてフレームバッファをサイズ変更するかどうかを指定します。コンテンツスケールは、ユーザーのシステム全体の設定変更や、異なるスケール設定を持つモニターへのウィンドウ移動によって変化します。
このヒントが効果を持つのは、macOS や Wayland のように、スクリーン座標をピクセル座標に対して拡大・縮小できるプラットフォームだけです。Windows や X11 などでは、フレームバッファとウィンドウのコンテンツ領域のサイズが常に 1:1 で対応します。
これは GLFW 3.4 で導入された新しい名前です。互換性のため、以前の GLFW_COCOA_RETINA_FRAMEBUFFER という名前も利用できます。どちらの名前も同じヒント値を変更します。
GLFW_MOUSE_PASSTHROUGH は、ウィンドウをマウス入力に対して透過させ、すべてのマウスイベントを背後のウィンドウへ通過させるかどうかを指定します。装飾のないウィンドウでだけサポートされます。装飾のあるウィンドウで有効にした場合の動作は、プラットフォームごとに異なります。指定できる値は GLFW_TRUE と GLFW_FALSE です。
GLFW_POSITION_X と GLFW_POSITION_Y は、希望するウィンドウの初期位置を指定します。ウィンドウマネージャーはこれらの座標を変更または無視する可能性があります。一方または両方のヒントを GLFW_ANY_POSITION に設定すると、ウィンドウマネージャーがユーザーの希望に合うと判断した場所へウィンドウを配置します。指定できる値は、有効な任意のスクリーン座標と GLFW_ANY_POSITION です。
フレームバッファ関連のヒント
GLFW_RED_BITS、GLFW_GREEN_BITS、GLFW_BLUE_BITS、GLFW_ALPHA_BITS、GLFW_DEPTH_BITS、GLFW_STENCIL_BITS は、デフォルトフレームバッファの各成分について希望するビット深度を指定します。GLFW_DONT_CARE は、アプリケーションに希望がないことを意味します。
GLFW_ACCUM_RED_BITS、GLFW_ACCUM_GREEN_BITS、GLFW_ACCUM_BLUE_BITS、GLFW_ACCUM_ALPHA_BITS は、アキュムレーションバッファの各成分について希望するビット深度を指定します。GLFW_DONT_CARE は、アプリケーションに希望がないことを意味します。
アキュムレーションバッファは古い OpenGL の機能であり、新しいコードでは使うべきではありません。
GLFW_AUX_BUFFERS は、希望する補助バッファ数を指定します。GLFW_DONT_CARE は、アプリケーションに希望がないことを意味します。
補助バッファは古い OpenGL の機能であり、新しいコードでは使うべきではありません。
GLFW_STEREO は、OpenGL の立体視描画を使うかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。これはハード制約です。
GLFW_SAMPLES は、マルチサンプリングに使う希望サンプル数を指定します。0 はマルチサンプリングを無効にします。GLFW_DONT_CARE は、アプリケーションに希望がないことを意味します。
GLFW_SRGB_CAPABLE は、フレームバッファを sRGB 対応にするかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。
注: OpenGL: 有効であり、システムがサポートしている場合、
GL_FRAMEBUFFER_SRGBの有効・無効によって sRGB 描画が制御されます。デフォルトでは sRGB 描画は無効です。
注: OpenGL ES: 有効であり、システムがサポートしている場合、コンテキストでは sRGB 描画が常に有効になります。
GLFW_DOUBLEBUFFER は、フレームバッファをダブルバッファリングするかどうかを指定します。ほぼすべての場合にダブルバッファリングを使うべきです。これはハード制約です。指定できる値は GLFW_TRUE と GLFW_FALSE です。
モニター関連のヒント
GLFW_REFRESH_RATE は、フルスクリーンウィンドウについて希望するリフレッシュレートを指定します。GLFW_DONT_CARE は、利用可能な最高のリフレッシュレートを使うことを意味します。ウィンドウモードのウィンドウでは無視されます。
コンテキスト関連のヒント
GLFW_CLIENT_API は、どのクライアント API 向けのコンテキストを作成するかを指定します。指定できる値は GLFW_OPENGL_API、GLFW_OPENGL_ES_API、GLFW_NO_API です。これはハード制約です。
GLFW_CONTEXT_CREATION_API は、コンテキストの作成に使うコンテキスト作成 API を指定します。指定できる値は GLFW_NATIVE_CONTEXT_API、GLFW_EGL_CONTEXT_API、GLFW_OSMESA_CONTEXT_API です。これはハード制約です。クライアント API を要求しない場合、このヒントは無視されます。
カレントコンテキストの作成に使われた API を把握していると仮定する拡張ローダーライブラリは、このヒントを変更すると失敗する可能性があります。glfwGetProcAddress を介して関数を読み込ませることで解決できます。
注: Wayland: EGL API がネイティブのコンテキスト作成 API そのものであるため、このヒントは効果を持ちません。
注: X11: 一部の Linux システムでは、単一プロセス内でネイティブ API と EGL API の両方を介してコンテキストを作成すると、アプリケーションがセグメンテーションフォールトを起こします。現時点では、Linux 上でどちらか一方の API だけを使ってください。
注: OSMesa: 名前が示すように、OSMesa で作成した OpenGL コンテキストは、バッファを交換してもウィンドウの内容を更新しません。フレームバッファの内容を取得するには、OpenGL 関数、または OSMesa のネイティブアクセス関数 glfwGetOSMesaColorBuffer と glfwGetOSMesaDepthBuffer を使ってください。
GLFW_CONTEXT_VERSION_MAJOR と GLFW_CONTEXT_VERSION_MINOR は、作成するコンテキストが互換性を持たなければならないクライアント API のバージョンを指定します。これらのヒントの正確な動作は、要求するクライアント API によって異なります。
サポートされる最高バージョンのコンテキストをドライバーへ直接要求する方法はありませんが、これらのヒントのデフォルトであるバージョン 1.0 のコンテキストを要求すると、GLFW は最高バージョンの提供を試みます。
これらのヒントを、GLFW ヘッダーの API バージョンを提供する GLFW_VERSION_MAJOR および GLFW_VERSION_MINOR と混同しないでください。
注: OpenGL: これらのヒントはハード制約ではありませんが、作成されたコンテキストの OpenGL バージョンが要求より低い場合、作成は失敗します。したがって、古いコードでデフォルトのバージョン 1.0 を使ってもまったく問題はなく、利用可能であればバージョン 3.0 以降の後方互換コンテキストを取得できます。
注: OpenGL ES: これらのヒントはハード制約ではありませんが、作成されたコンテキストの OpenGL ES バージョンが要求より低い場合、作成は失敗します。また、2.0 以降を要求した場合は OpenGL ES 1.x を返せず、その逆も同様です。これは、OpenGL ES 3.x は 2.0 と後方互換ですが、OpenGL ES 2.0 は 1.x と後方互換ではないためです。
注: macOS: OS が OpenGL バージョン 3.2 以降でサポートするのは、コアプロファイルのコンテキストだけです。バージョン 3.2 以降の OpenGL コンテキストを作成する前に、GLFW_OPENGL_PROFILE ヒントを適切に設定しなければなりません。macOS は OpenGL 3.0 および 3.1 のコンテキストを一切サポートしません。
GLFW_OPENGL_FORWARD_COMPAT は、OpenGL コンテキストを前方互換にするかどうかを指定します。前方互換コンテキストでは、要求した OpenGL バージョンで非推奨となったすべての機能が削除されます。要求する OpenGL バージョンが 3.0 以降の場合に限って使わなければなりません。OpenGL ES を要求する場合、このヒントは無視されます。
前方互換性について詳しくは、OpenGL Reference Manualを参照してください。
GLFW_CONTEXT_DEBUG は、コンテキストをデバッグモードで作成するかどうかを指定します。デバッグモードでは、追加のエラー・診断通知機能が提供される可能性があります。指定できる値は GLFW_TRUE と GLFW_FALSE です。
OpenGL および OpenGL ES のデバッグコンテキストについて詳しくは、GL_KHR_debug 拡張を参照してください。
注:
GLFW_CONTEXT_DEBUGは GLFW 3.4 で導入された新しい名前です。互換性のため、以前のGLFW_OPENGL_DEBUG_CONTEXTという名前も利用できます。
GLFW_OPENGL_PROFILE は、どの OpenGL プロファイル向けのコンテキストを作成するかを指定します。指定できる値は GLFW_OPENGL_CORE_PROFILE または GLFW_OPENGL_COMPAT_PROFILE のいずれか、あるいは特定のプロファイルを要求しない GLFW_OPENGL_ANY_PROFILE です。3.2 より前の OpenGL バージョンを要求する場合は、GLFW_OPENGL_ANY_PROFILE を使わなければなりません。OpenGL ES を要求する場合、このヒントは無視されます。
OpenGL プロファイルについて詳しくは、OpenGL Reference Manualを参照してください。
GLFW_CONTEXT_ROBUSTNESS は、コンテキストが使う堅牢性戦略を指定します。GLFW_NO_RESET_NOTIFICATION または GLFW_LOSE_CONTEXT_ON_RESET のいずれか、あるいは堅牢性戦略を要求しない GLFW_NO_ROBUSTNESS を指定できます。
GLFW_CONTEXT_RELEASE_BEHAVIOR は、コンテキストが使う解放時の動作を指定します。指定できる値は GLFW_ANY_RELEASE_BEHAVIOR、GLFW_RELEASE_BEHAVIOR_FLUSH、GLFW_RELEASE_BEHAVIOR_NONE のいずれかです。GLFW_ANY_RELEASE_BEHAVIOR の場合は、コンテキスト作成 API のデフォルト動作が使われます。GLFW_RELEASE_BEHAVIOR_FLUSH の場合は、コンテキストがカレントではなくなるたびにパイプラインをフラッシュします。GLFW_RELEASE_BEHAVIOR_NONE の場合は、解放時にパイプラインをフラッシュしません。
コンテキスト解放時の動作について詳しくは、GL_KHR_context_flush_control 拡張を参照してください。
GLFW_CONTEXT_NO_ERROR は、コンテキストがエラーを生成するかどうかを指定します。指定できる値は GLFW_TRUE と GLFW_FALSE です。有効にすると、本来エラーが生成される状況で、代わりに未定義動作が発生します。
OpenGL および OpenGL ES のエラーなしモードについて詳しくは、GL_KHR_no_error 拡張を参照してください。
Win32固有のヒント
GLFW_WIN32_KEYBOARD_MENU は、Alt+Space および Alt を押してから Space を押すキーボードショートカットでウィンドウメニューへアクセスできるようにするかどうかを指定します。ほかのプラットフォームでは無視されます。
GLFW_WIN32_SHOWDEFAULT は、ウィンドウを初めて表示するときに、プログラムの STARTUPINFO で指定された方法で表示するかどうかを指定します。これはショートカットのプロパティウィンドウにある Run オプションと同じ情報です。プログラムの起動時にこの情報が指定されなかった場合、GLFW はこのヒントが GLFW_FALSE に設定されたものとして動作します。指定できる値は GLFW_TRUE と GLFW_FALSE です。ほかのプラットフォームでは無視されます。
macOS固有のヒント
GLFW_COCOA_FRAME_NAME は、ウィンドウフレームの自動保存に使う UTF-8 エンコードの名前を指定します。空の場合、そのウィンドウではフレームの自動保存が無効になります。ほかのプラットフォームでは無視されます。glfwWindowHintString で設定します。
GLFW_COCOA_GRAPHICS_SWITCHING は、自動グラフィックス切り替えへ参加するかどうかを指定します。つまり、OpenGL コンテキストに統合 GPU を使い、必要に応じて GPU 間を移動することをシステムに許可するか、常に単体 GPU で実行するよう強制するかを指定します。統合 GPU と単体 GPU の両方を備えたシステムだけに影響します。指定できる値は GLFW_TRUE と GLFW_FALSE です。ほかのプラットフォームでは無視されます。
単純なプログラムやツールでは節電のために有効にするとよいでしょう。一方、ゲームなど高度な描画を行うアプリケーションでは無効のままにするとよいでしょう。
自動グラフィックス切り替えへ参加するバンドル形式のアプリケーションは、Info.plist の NSSupportsAutomaticGraphicsSwitching キーを true に設定し、そのことを宣言する必要もあります。
Wayland固有のウィンドウヒント
GLFW_WAYLAND_APP_ID は、ウィンドウの Wayland app_id を指定します。ウィンドウマネージャーは、これを使ってウィンドウの種類を識別します。glfwWindowHintString で設定します。
X11固有のウィンドウヒント
GLFW_X11_CLASS_NAME と GLFW_X11_INSTANCE_NAME は、ICCCM の WM_CLASS ウィンドウプロパティについて、希望する ASCII エンコードのクラス部分とインスタンス部分を指定します。効果を持たせるには、両方のヒントを空文字列以外に設定する必要があります。glfwWindowHintString で設定します。
サポートされる値とデフォルト値
| ウィンドウヒント | デフォルト値 | サポートされる値 |
|---|---|---|
| GLFW_RESIZABLE | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_VISIBLE | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_DECORATED | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_FOCUSED | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_AUTO_ICONIFY | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_FLOATING | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_MAXIMIZED | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_CENTER_CURSOR | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_TRANSPARENT_FRAMEBUFFER | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_FOCUS_ON_SHOW | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_SCALE_TO_MONITOR | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_SCALE_FRAMEBUFFER | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_MOUSE_PASSTHROUGH | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_POSITION_X | GLFW_ANY_POSITION | 有効な任意のスクリーンX座標または GLFW_ANY_POSITION |
| GLFW_POSITION_Y | GLFW_ANY_POSITION | 有効な任意のスクリーンY座標または GLFW_ANY_POSITION |
| GLFW_RED_BITS | 8 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_GREEN_BITS | 8 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_BLUE_BITS | 8 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_ALPHA_BITS | 8 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_DEPTH_BITS | 24 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_STENCIL_BITS | 8 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_ACCUM_RED_BITS | 0 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_ACCUM_GREEN_BITS | 0 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_ACCUM_BLUE_BITS | 0 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_ACCUM_ALPHA_BITS | 0 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_AUX_BUFFERS | 0 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_SAMPLES | 0 | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_REFRESH_RATE | GLFW_DONT_CARE | 0~INT_MAXまたは GLFW_DONT_CARE |
| GLFW_STEREO | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_SRGB_CAPABLE | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_DOUBLEBUFFER | GLFW_TRUE | GLFW_TRUE または GLFW_FALSE |
| GLFW_CLIENT_API | GLFW_OPENGL_API | GLFW_OPENGL_API、GLFW_OPENGL_ES_API、GLFW_NO_API のいずれか |
| GLFW_CONTEXT_CREATION_API | GLFW_NATIVE_CONTEXT_API | GLFW_NATIVE_CONTEXT_API、GLFW_EGL_CONTEXT_API、GLFW_OSMESA_CONTEXT_API のいずれか |
| GLFW_CONTEXT_VERSION_MAJOR | 1 | 選択したクライアント API の有効な任意のメジャーバージョン番号 |
| GLFW_CONTEXT_VERSION_MINOR | 0 | 選択したクライアント API の有効な任意のマイナーバージョン番号 |
| GLFW_CONTEXT_ROBUSTNESS | GLFW_NO_ROBUSTNESS | GLFW_NO_ROBUSTNESS、GLFW_NO_RESET_NOTIFICATION、GLFW_LOSE_CONTEXT_ON_RESET のいずれか |
| GLFW_CONTEXT_RELEASE_BEHAVIOR | GLFW_ANY_RELEASE_BEHAVIOR | GLFW_ANY_RELEASE_BEHAVIOR、GLFW_RELEASE_BEHAVIOR_FLUSH、GLFW_RELEASE_BEHAVIOR_NONE のいずれか |
| GLFW_OPENGL_FORWARD_COMPAT | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_CONTEXT_DEBUG | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_OPENGL_PROFILE | GLFW_OPENGL_ANY_PROFILE | GLFW_OPENGL_ANY_PROFILE、GLFW_OPENGL_COMPAT_PROFILE、GLFW_OPENGL_CORE_PROFILE のいずれか |
| GLFW_WIN32_KEYBOARD_MENU | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_WIN32_SHOWDEFAULT | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_COCOA_FRAME_NAME | "" | UTF-8 エンコードのフレーム自動保存名 |
| GLFW_COCOA_GRAPHICS_SWITCHING | GLFW_FALSE | GLFW_TRUE または GLFW_FALSE |
| GLFW_WAYLAND_APP_ID | "" | ASCII エンコードの Wayland app_id 名 |
| GLFW_X11_CLASS_NAME | "" | ASCII エンコードの WM_CLASS クラス名 |
| GLFW_X11_INSTANCE_NAME | "" | ASCII エンコードの WM_CLASS インスタンス名 |
ウィンドウイベントの処理
eventsを参照してください。
ウィンドウのプロパティとイベント
ユーザーポインター
各ウィンドウには、glfwSetWindowUserPointer で設定し、glfwGetWindowUserPointer で取得できるユーザーポインターがあります。任意の用途に使用でき、ウィンドウの有効期間を通じて GLFW が変更することはありません。
ポインターの初期値は NULL です。
ウィンドウを閉じる操作とクローズフラグ
ユーザーが閉じるボタンをクリックしたり Alt+F4 のようなキー操作を使ったりしてウィンドウを閉じようとすると、ウィンドウの_クローズフラグ_が設定されます。ただし、実際にウィンドウが破棄されるわけではなく、この状態変化を監視しなければ、それ以上は何も起こりません。
クローズフラグの現在の状態は glfwWindowShouldClose が返します。また、glfwSetWindowShouldClose で直接設定・解除できます。一般的には、クローズフラグをメインループの条件として使います。
while (!glfwWindowShouldClose(window))
{
render(window);
glfwSwapBuffers(window);
glfwPollEvents();
}ユーザーがウィンドウを閉じようとしたときに通知を受け取りたい場合は、クローズコールバックを設定します。
glfwSetWindowCloseCallback(window, window_close_callback);コールバック関数は、クローズフラグが設定された_直後_に呼び出されます。たとえば、クローズ要求を選別し、特定の条件を満たさない場合にクローズフラグを再び解除するために使えます。
void window_close_callback(GLFWwindow* window)
{
if (!time_to_close)
glfwSetWindowShouldClose(window, GLFW_FALSE);
}ウィンドウサイズ
ウィンドウのサイズは glfwSetWindowSize で変更できます。ウィンドウモードのウィンドウでは、ウィンドウの_コンテンツ領域_のサイズをスクリーン座標で設定します。ウィンドウシステムがウィンドウサイズに制限を課すことがあります。
glfwSetWindowSize(window, 640, 480);フルスクリーンウィンドウでは、指定したサイズが希望する新しいビデオモードの解像度になります。希望する新しいビデオモードに最も近いビデオモードが直ちに設定され、その解像度に合うようウィンドウのサイズが変更されます。
ユーザー、システム、または自身のコードによってウィンドウのサイズが変更されたときに通知を受け取りたい場合は、サイズコールバックを設定します。
glfwSetWindowSizeCallback(window, window_size_callback);コールバック関数は、ウィンドウのサイズ変更時に、コンテンツ領域の新しいサイズをスクリーン座標で受け取ります。
void window_size_callback(GLFWwindow* window, int width, int height)
{
}glfwGetWindowSize を使うと、ウィンドウの現在のサイズを直接取得できます。
int width, height;
glfwGetWindowSize(window, &width, &height);注: ウィンドウサイズを
glViewportなどのピクセル単位の OpenGL 呼び出しへ渡さないでください。ウィンドウサイズの単位はピクセルではなくスクリーン座標です。ピクセル単位の呼び出しには、ピクセルで表されるフレームバッファサイズを使ってください。
上記の関数はコンテンツ領域のサイズを扱いますが、装飾のあるウィンドウでは通常、この長方形の周囲にタイトルバーとウィンドウフレームがあります。glfwGetWindowFrameSize でそれらの幅を取得できます。
int left, top, right, bottom;
glfwGetWindowFrameSize(window, &left, &top, &right, &bottom);返される値は、コンテンツ領域の各辺からウィンドウ全体の対応する辺までの距離をスクリーン座標で表します。座標ではなく距離であるため、常に0以上です。
フレームバッファサイズ
ウィンドウサイズはスクリーン座標で測定しますが、OpenGL はピクセルを扱います。たとえば、glViewport へ渡すサイズはピクセル単位でなければなりません。スクリーン座標とピクセルが同じマシンもありますが、異なるマシンもあります。ウィンドウのフレームバッファサイズをピクセル単位で取得するために、別の関数群が用意されています。
ユーザーまたはシステムによってウィンドウのフレームバッファのサイズが変更されたときに通知を受け取りたい場合は、サイズコールバックを設定します。
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);コールバック関数は、フレームバッファのサイズ変更時に新しいサイズを受け取ります。たとえば、OpenGL ビューポートの更新に使えます。
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}glfwGetFramebufferSize を使うと、ウィンドウのフレームバッファの現在のサイズを直接取得できます。
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);たとえば通常のモニターと高 DPI モニターの間でウィンドウをドラッグした場合など、フレームバッファのサイズはウィンドウサイズとは独立して変化することがあります。
ウィンドウのコンテンツスケール
ウィンドウのコンテンツスケールは glfwGetWindowContentScale で取得できます。
float xscale, yscale;
glfwGetWindowContentScale(window, &xscale, &yscale);コンテンツスケールは、現在の DPI とプラットフォームのデフォルト DPI の比率と考えることができます。テキストなどの UI 要素のピクセル寸法へ適用する倍率として意図されています。この倍率で拡大・縮小した寸法が使用中のマシンで適切に見えるなら、DPI やスケーリング設定が異なるほかのマシンでも妥当な大きさで表示されるはずです。
これは、両方のマシンで DPI とスケーリングの設定が適切であることに依存します。
コンテンツスケールは、モニターの解像度とピクセル密度、DPI や倍率などのユーザー設定の両方に依存する可能性があります。物理サイズと現在の解像度から計算した生の DPI とは大きく異なる場合があります。
モニターごとに独自のコンテンツスケールを持てるシステムでは、ウィンドウのコンテンツスケールは、システムがそのウィンドウをどのモニター上にあるとみなすかに依存します。
システム設定の変更や、異なるスケールのモニターへの移動によってウィンドウのコンテンツスケールが変化したときに通知を受け取りたい場合は、コンテンツスケールコールバックを設定します。
glfwSetWindowContentScaleCallback(window, window_content_scale_callback);コールバック関数は、ウィンドウの新しいコンテンツスケールを受け取ります。
void window_content_scale_callback(GLFWwindow* window, float xscale, float yscale)
{
set_interface_scale(xscale, yscale);
}ピクセルとスクリーン座標が常に 1:1 で対応するプラットフォームでは、コンテンツスケールが異なるモニターへ移動しても同じ大きさに見えるよう、ウィンドウのサイズを変更する必要があります。ウィンドウの作成時と、その後にコンテンツスケールが変化したときの両方で自動的に行うには、GLFW_SCALE_TO_MONITOR ウィンドウヒントを設定します。
ピクセルとスクリーン座標が必ずしも等しくないプラットフォームでは、代わりにウィンドウへ完全な解像度の画像を提供できるよう、フレームバッファのサイズを変更する必要があります。コンテンツスケールが異なるモニター間をウィンドウが移動すると、ウィンドウサイズは同じままですが、フレームバッファサイズが変化します。これはデフォルトで自動的に行われます。このサイズ変更を無効にするには、GLFW_SCALE_FRAMEBUFFER ウィンドウヒントを設定します。
どちらのヒントもウィンドウの作成時に適用されます。すべてのウィンドウはコンテンツスケール 1 で開始します。一方または両方のヒントが設定されたウィンドウは、作成、設定、表示される過程で適切なスケールへ適応します。
ウィンドウサイズの制限
ウィンドウモードのウィンドウのコンテンツ領域について、最小・最大サイズを glfwSetWindowSizeLimits で強制できます。アスペクト比も設定されていない限り、ユーザーは指定した制限内で任意のサイズとアスペクト比へウィンドウを変更できます。
glfwSetWindowSizeLimits(window, 200, 200, 400, 400);最小サイズと最大サイズの一方だけを指定するには、もう一方の組を GLFW_DONT_CARE に設定します。
glfwSetWindowSizeLimits(window, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);ウィンドウのサイズ制限を無効にするには、すべてを GLFW_DONT_CARE に設定します。
ウィンドウモードのウィンドウのコンテンツ領域について、アスペクト比を glfwSetWindowAspectRatio で強制できます。サイズ制限も設定されていない限り、ユーザーはウィンドウを自由にサイズ変更できますが、アスペクト比を保つようサイズが制約されます。
glfwSetWindowAspectRatio(window, 16, 9);アスペクト比は分子と分母で指定し、それぞれ幅と高さに対応します。ウィンドウに現在のアスペクト比を維持させるには、現在のサイズを比率として使います。
int width, height;
glfwGetWindowSize(window, &width, &height);
glfwSetWindowAspectRatio(window, width, height);ウィンドウのアスペクト比制限を無効にするには、両方の値を GLFW_DONT_CARE に設定します。
1つのウィンドウにサイズ制限とアスペクト比の両方を設定できますが、両者が矛盾する場合の結果は未定義です。
ウィンドウの位置
デフォルトでは、ウィンドウマネージャーがウィンドウのサイズと、ユーザーが作業しているように見えるモニターに基づき、新しいウィンドウモードのウィンドウの位置を選択します。ほとんどの場合、これが適切です。特定の位置にウィンドウを作成する必要がある場合は、GLFW_POSITION_X と GLFW_POSITION_Y ウィンドウヒントで希望する位置を設定できます。
glfwWindowHint(GLFW_POSITION_X, 70);
glfwWindowHint(GLFW_POSITION_Y, 83);以前の動作へ戻すには、これらのヒントを GLFW_ANY_POSITION に設定します。
ウィンドウモードのウィンドウの位置は glfwSetWindowPos で変更できます。この関数は、コンテンツ領域の左上隅が指定したスクリーン座標になるようウィンドウを移動します。ウィンドウシステムがウィンドウの配置に制限を課すことがあります。
glfwSetWindowPos(window, 100, 100);ユーザー、システム、または自身のコードによってウィンドウが移動したときに通知を受け取りたい場合は、位置コールバックを設定します。
glfwSetWindowPosCallback(window, window_pos_callback);コールバック関数は、ウィンドウが移動したときに、コンテンツ領域の左上隅の新しい位置をスクリーン座標で受け取ります。
void window_pos_callback(GLFWwindow* window, int xpos, int ypos)
{
}glfwGetWindowPos を使うと、ウィンドウのコンテンツ領域の現在位置を直接取得できます。
int xpos, ypos;
glfwGetWindowPos(window, &xpos, &ypos);注: Wayland: アプリケーションは、ウィンドウの位置やウィンドウが移動したかどうかを知ることができません。GLFW_POSITION_X と GLFW_POSITION_Y ウィンドウヒントは無視されます。glfwGetWindowPos と glfwSetWindowPos は GLFW_FEATURE_UNAVAILABLE を通知します。ウィンドウ位置コールバックは呼び出されません。
ウィンドウタイトル
GLFW のすべてのウィンドウにはタイトルがあります。ただし、装飾のないウィンドウやフルスクリーンウィンドウでは表示されないか、タスクバーなどのインターフェースにだけ表示される場合があります。glfwSetWindowTitle で、UTF-8 エンコードの新しいウィンドウタイトルを設定できます。
glfwSetWindowTitle(window, "My Window");指定した文字列は関数が処理を返す前にコピーされるため、保持する必要はありません。
ソースファイルが UTF-8 でエンコードされていれば、任意の Unicode 文字をソース内で直接使えます。
glfwSetWindowTitle(window, "ラストエグザイル");C++11 または C11 を使っている場合は、UTF-8 文字列リテラルを使えます。
glfwSetWindowTitle(window, u8"This is always a UTF-8 string");現在のウィンドウタイトルは glfwGetWindowTitle で取得できます。
const char* title = glfwGetWindowTitle(window);ウィンドウアイコン
一部のプラットフォームでは、装飾のあるウィンドウにアイコンがあります。glfwSetWindowIcon へ候補画像の一覧を指定すると、このアイコンを設定できます。
GLFWimage images[2];
images[0] = load_icon("my_icon.png");
images[1] = load_icon("my_icon_small.png");
glfwSetWindowIcon(window, 2, images);画像データは32ビット、リトルエンディアン、乗算済みではない RGBA 形式です。つまり、各チャンネル8ビットで、赤チャンネルが先頭です。ピクセルは左上隅から始まる連続した行として、標準的な順序で配置します。
デフォルトのウィンドウアイコンへ戻すには、空の画像配列を渡します。
glfwSetWindowIcon(window, 0, NULL);ウィンドウのモニター
フルスクリーンウィンドウには特定のモニターが関連付けられています。このモニターのハンドルは glfwGetWindowMonitor で取得できます。
GLFWmonitor* monitor = glfwGetWindowMonitor(window);このモニターハンドルは、glfwGetMonitors が返すものの1つです。
ウィンドウモードのウィンドウについて、この関数は NULL を返します。これにより、フルスクリーンウィンドウとウィンドウモードのウィンドウを区別できます。
glfwSetWindowMonitor を使うと、ウィンドウをモニター間で移動したり、フルスクリーンとウィンドウモードの間で切り替えたりできます。同じまたは別のモニター上でウィンドウをフルスクリーンにする場合は、希望するモニター、解像度、リフレッシュレートを指定します。位置引数は無視されます。
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);ウィンドウモードにする場合は、希望する位置とサイズを指定します。リフレッシュレート引数は無視されます。
glfwSetWindowMonitor(window, NULL, xpos, ypos, width, height, 0);これにより、装飾、前面表示、サイズ変更の可否、サイズ制限またはアスペクト比制限など、以前のウィンドウ設定が復元されます。元々ウィンドウモードだったウィンドウを元のサイズと位置へ戻すには、フルスクリーンにする前にこれらを保存し、上記のように渡してください。
ウィンドウのアイコン化
ウィンドウは glfwIconifyWindow でアイコン化(最小化)できます。
glfwIconifyWindow(window);フルスクリーンウィンドウをアイコン化すると、ユーザーまたはアプリケーションがウィンドウを復元するまで、そのモニターの元のビデオモードが復元されます。
アイコン化されたウィンドウは glfwRestoreWindow で復元できます。この関数は、最大化されたウィンドウも復元します。
glfwRestoreWindow(window);フルスクリーンウィンドウを復元すると、希望するビデオモードもそのモニターへ復元されます。
ユーザー、システム、または自身のコードによってウィンドウがアイコン化・復元されたときに通知を受け取りたい場合は、アイコン化コールバックを設定します。
glfwSetWindowIconifyCallback(window, window_iconify_callback);コールバック関数は、ウィンドウのアイコン化状態の変化を受け取ります。
void window_iconify_callback(GLFWwindow* window, int iconified)
{
if (iconified)
{
// The window was iconified
}
else
{
// The window was restored
}
}glfwGetWindowAttrib で、現在のアイコン化状態を取得することもできます。
int iconified = glfwGetWindowAttrib(window, GLFW_ICONIFIED);注: Wayland: アプリケーションは、自身のウィンドウがアイコン化されたかどうかを知ることも、アイコン化状態から復元することもできません。glfwRestoreWindow は最大化状態からのみ復元でき、アイコン化コールバックは呼び出されません。GLFW_ICONIFIED 属性は偽になります。glfwIconifyWindow は通常どおり機能します。
ウィンドウの最大化
ウィンドウは glfwMaximizeWindow で最大化できます。
glfwMaximizeWindow(window);フルスクリーンウィンドウは最大化できません。この関数へフルスクリーンウィンドウを渡しても何も起こりません。
最大化されたウィンドウは glfwRestoreWindow で復元できます。この関数は、アイコン化されたウィンドウも復元します。
glfwRestoreWindow(window);ユーザー、システム、または自身のコードによってウィンドウが最大化・復元されたときに通知を受け取りたい場合は、最大化コールバックを設定します。
glfwSetWindowMaximizeCallback(window, window_maximize_callback);コールバック関数は、ウィンドウの最大化状態の変化を受け取ります。
void window_maximize_callback(GLFWwindow* window, int maximized)
{
if (maximized)
{
// The window was maximized
}
else
{
// The window was restored
}
}glfwGetWindowAttrib で、現在の最大化状態を取得することもできます。
int maximized = glfwGetWindowAttrib(window, GLFW_MAXIMIZED);新しく作成したウィンドウは、デフォルトでは最大化されません。ウィンドウを作成する前に GLFW_MAXIMIZED ウィンドウヒントを設定すると、この動作を変更できます。
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);ウィンドウの表示状態
ウィンドウモードのウィンドウは glfwHideWindow で非表示にできます。
glfwHideWindow(window);これにより、タスクバー、Dock、ウィンドウ一覧からの削除も含め、ウィンドウはユーザーから完全に見えなくなります。フルスクリーンウィンドウは非表示にできず、フルスクリーンウィンドウに対して glfwHideWindow を呼び出しても何も起こりません。
非表示のウィンドウは glfwShowWindow で表示できます。
glfwShowWindow(window);デフォルトでは、この関数はそのウィンドウへ入力フォーカスも設定します。新しく作成するすべてのウィンドウについてこの動作を変更するには GLFW_FOCUS_ON_SHOW ウィンドウヒントを設定し、既存のウィンドウについて変更するには glfwSetWindowAttrib を使います。
glfwGetWindowAttrib で、現在の表示状態を取得することもできます。
int visible = glfwGetWindowAttrib(window, GLFW_VISIBLE);新しく作成したウィンドウは、デフォルトで表示されます。ウィンドウを作成する前に GLFW_VISIBLE ウィンドウヒントを設定すると、この動作を変更できます。
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);非表示として作成したウィンドウは、表示するまでユーザーから完全に見えません。たとえば特定の位置へ移動するなど、表示前にウィンドウをさらに設定する必要がある場合に便利です。
ウィンドウの入力フォーカス
glfwFocusWindow を使うと、ウィンドウへ入力フォーカスを与えて前面へ移動できます。
glfwFocusWindow(window);ウィンドウを強制的に最前面へ移動すると、ユーザーの操作を大きく妨げる可能性があることに注意してください。ユーザーの注意を引く、より穏当な方法については、注意要求を参照してください。
ユーザー、システム、または自身のコードによってウィンドウが入力フォーカスを得た、または失ったときに通知を受け取りたい場合は、フォーカスコールバックを設定します。
glfwSetWindowFocusCallback(window, window_focus_callback);コールバック関数は、ウィンドウの入力フォーカス状態の変化を受け取ります。
void window_focus_callback(GLFWwindow* window, int focused)
{
if (focused)
{
// The window gained input focus
}
else
{
// The window lost input focus
}
}glfwGetWindowAttrib で、現在の入力フォーカス状態を取得することもできます。
int focused = glfwGetWindowAttrib(window, GLFW_FOCUSED);新しく作成したウィンドウには、デフォルトで入力フォーカスが与えられます。ウィンドウを作成する前に GLFW_FOCUSED ウィンドウヒントを設定すると、この動作を変更できます。
glfwWindowHint(GLFW_FOCUSED, GLFW_FALSE);ウィンドウへの注意要求
ユーザーを中断せずにイベントを知らせたい場合は、glfwRequestWindowAttention で注意を要求できます。
glfwRequestWindowAttention(window);システムは指定したウィンドウを強調表示します。これをサポートしないプラットフォームでは、アプリケーション全体を強調表示します。ユーザーが注意を向けると、システムが自動的に要求を終了します。
ウィンドウの損傷と再描画
ウィンドウの内容が損傷して再描画が必要になったときに通知を受け取りたい場合は、ウィンドウ再描画コールバックを設定します。
glfwSetWindowRefreshCallback(m_handle, window_refresh_callback);コールバック関数は、ウィンドウの内容を再描画する必要があるときに呼び出されます。
void window_refresh_callback(GLFWwindow* window)
{
draw_editor_ui(window);
glfwSwapBuffers(window);
}注: Aero、Compiz、Aqua など、ウィンドウの内容をオフスクリーンに保存する合成ウィンドウシステムでは、このコールバックがウィンドウまたはフレームバッファのサイズ変更時にしか呼び出されない可能性があります。
ウィンドウの透明度
GLFW はウィンドウについて、フレームバッファ透明度とウィンドウ全体の透明度という2種類の透明化をサポートします。単一のウィンドウで両方の方法を使ってはなりません。使った場合の結果は未定義です。
どちらの方法もプラットフォーム側のサポートを必要とします。GLFW がサポートする各プラットフォームのすべてのバージョンが対応するわけではないため、ウィンドウが実際に透明かどうかを確認する仕組みがあります。
GLFW_TRANSPARENT_FRAMEBUFFER ウィンドウヒントを使うと、ウィンドウのフレームバッファをピクセルごと、フレームごとに透明にできます。
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);システムがサポートしている場合、フレームバッファのピクセル単位のアルファチャンネルを使って、ウィンドウのコンテンツ領域を背景と合成します。これにはシステム上でデスクトップ合成が有効になっている必要があります。ウィンドウ装飾には影響しません。
GLFW_TRANSPARENT_FRAMEBUFFER ウィンドウ属性を使うと、ウィンドウのフレームバッファを透明にできたか確認できます。
if (glfwGetWindowAttrib(window, GLFW_TRANSPARENT_FRAMEBUFFER))
{
// window framebuffer is currently transparent
}GLFW には、フレームバッファ透明度を有効にする gears というサンプルが付属します。
装飾を含むウィンドウ全体の不透明度は、glfwSetWindowOpacity で設定できます。
glfwSetWindowOpacity(window, 0.5f);不透明度(アルファ)値は、0から1までの正の有限数です。0 は完全な透明、1 は完全な不透明を表します。新しく作成したウィンドウの初期不透明度は1です。
ウィンドウの現在の不透明度は glfwGetWindowOpacity で取得できます。
float opacity = glfwGetWindowOpacity(window);システムがウィンドウ全体の透明化をサポートしない場合、この関数は常に1を返します。
GLFW には、実行時にウィンドウ全体の透明度を制御できる window というテストプログラムが付属します。
通知など一時的なオーバーレイを表示するために、これらの透明化方法のいずれかを使う場合は、GLFW_FLOATING と GLFW_MOUSE_PASSTHROUGH のウィンドウヒントおよび属性が役立つ可能性があります。
ウィンドウ属性
ウィンドウには、glfwGetWindowAttrib で取得できる多くの属性があります。ユーザー操作によって変化する可能性がある状態(入力フォーカスの有無など)を反映するものも、ウィンドウ固有の性質(境界線の種類など)を反映するものもあります。ウィンドウに関係するものと、その OpenGL または OpenGL ES コンテキストに関係するものがあります。
if (glfwGetWindowAttrib(window, GLFW_FOCUSED))
{
// window has input focus
}GLFW_DECORATED、GLFW_RESIZABLE、GLFW_FLOATING、GLFW_AUTO_ICONIFY、GLFW_FOCUS_ON_SHOW の各ウィンドウ属性は glfwSetWindowAttrib で変更できます。
glfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_FALSE);ウィンドウ関連の属性
GLFW_FOCUSED は、指定したウィンドウが入力フォーカスを持つかどうかを示します。詳しくは window_focusを参照してください。
GLFW_ICONIFIED は、指定したウィンドウがアイコン化されているかどうかを示します。詳しくは window_iconifyを参照してください。
GLFW_MAXIMIZED は、指定したウィンドウが最大化されているかどうかを示します。詳しくは window_maximizeを参照してください。
GLFW_HOVERED は、ほかのウィンドウを挟まず、カーソルが現在ウィンドウのコンテンツ領域上に直接あるかどうかを示します。詳しくは cursor_enterを参照してください。
GLFW_VISIBLE は、指定したウィンドウが表示されているかどうかを示します。詳しくは window_hideを参照してください。
GLFW_RESIZABLE は、指定したウィンドウを_ユーザーが_サイズ変更できるかどうかを示します。作成前は GLFW_RESIZABLE ウィンドウヒント、作成後は glfwSetWindowAttrib で設定できます。
GLFW_DECORATED は、指定したウィンドウに境界線や閉じるボタンなどの装飾があるかどうかを示します。作成前は GLFW_DECORATED ウィンドウヒント、作成後は glfwSetWindowAttrib で設定できます。
GLFW_AUTO_ICONIFY は、指定したフルスクリーンウィンドウがフォーカスを失ったときにアイコン化されるかどうかを示します。作成前は GLFW_AUTO_ICONIFY ウィンドウヒント、作成後は glfwSetWindowAttrib で設定できます。
GLFW_FLOATING は、指定したウィンドウが前面表示されるかどうかを示します。これは topmost または always-on-top とも呼ばれます。作成前は GLFW_FLOATING ウィンドウヒント、作成後は glfwSetWindowAttrib で設定できます。
GLFW_TRANSPARENT_FRAMEBUFFER は、指定したウィンドウが透明なフレームバッファを持つかどうかを示します。つまり、ウィンドウのフレームバッファのアルファチャンネルを使って、ウィンドウの内容を背景と合成するかどうかです。詳しくは window_transparencyを参照してください。
GLFW_FOCUS_ON_SHOW は、glfwShowWindow の呼び出し時にウィンドウへ入力フォーカスを与えるかどうかを指定します。作成前は GLFW_FOCUS_ON_SHOW ウィンドウヒント、作成後は glfwSetWindowAttrib で設定できます。
GLFW_MOUSE_PASSTHROUGH は、ウィンドウをマウス入力に対して透過させ、すべてのマウスイベントを背後のウィンドウへ通過させるかどうかを指定します。作成前は GLFW_MOUSE_PASSTHROUGH ウィンドウヒント、作成後は glfwSetWindowAttrib で設定できます。装飾のないウィンドウでだけサポートされます。装飾のあるウィンドウで有効にした場合の動作は、プラットフォームごとに異なります。
コンテキスト関連の属性
GLFW_CLIENT_API は、ウィンドウのコンテキストが提供するクライアント API を示します。GLFW_OPENGL_API、GLFW_OPENGL_ES_API、GLFW_NO_API のいずれかです。
GLFW_CONTEXT_CREATION_API は、ウィンドウのコンテキストの作成に使われたコンテキスト作成 API を示します。GLFW_NATIVE_CONTEXT_API、GLFW_EGL_CONTEXT_API、GLFW_OSMESA_CONTEXT_API のいずれかです。
GLFW_CONTEXT_VERSION_MAJOR、GLFW_CONTEXT_VERSION_MINOR、GLFW_CONTEXT_REVISION は、ウィンドウのコンテキストのクライアント API バージョンを示します。
注: これらの属性を、GLFW ヘッダーの API バージョンを提供する
GLFW_VERSION_MAJOR、GLFW_VERSION_MINOR、GLFW_VERSION_REVISIONと混同しないでください。
GLFW_OPENGL_FORWARD_COMPAT は、ウィンドウのコンテキストが前方互換 OpenGL コンテキストなら GLFW_TRUE、それ以外なら GLFW_FALSE です。
GLFW_CONTEXT_DEBUG は、ウィンドウのコンテキストがデバッグモードなら GLFW_TRUE、それ以外なら GLFW_FALSE です。
これは GLFW 3.4 で導入された新しい名前です。互換性のため、以前の GLFW_OPENGL_DEBUG_CONTEXT という名前も利用できます。
GLFW_OPENGL_PROFILE は、コンテキストが使う OpenGL プロファイルを示します。コンテキストが既知のプロファイルを使う場合は GLFW_OPENGL_CORE_PROFILE または GLFW_OPENGL_COMPAT_PROFILE、OpenGL プロファイルが不明な場合や OpenGL ES コンテキストの場合は GLFW_OPENGL_ANY_PROFILE です。プロファイルのビットが設定されていない場合、GLFW は別の方法でプロファイルの検出を試みるため、返されるプロファイルはコンテキストフラグのプロファイルビットと一致しないことがあります。
GLFW_CONTEXT_RELEASE_BEHAVIOR は、コンテキストが使う解放時の動作を示します。指定できる値は GLFW_ANY_RELEASE_BEHAVIOR、GLFW_RELEASE_BEHAVIOR_FLUSH、GLFW_RELEASE_BEHAVIOR_NONE のいずれかです。GLFW_ANY_RELEASE_BEHAVIOR の場合は、コンテキスト作成 API のデフォルト動作が使われます。GLFW_RELEASE_BEHAVIOR_FLUSH の場合は、コンテキストがカレントではなくなるたびにパイプラインをフラッシュします。GLFW_RELEASE_BEHAVIOR_NONE の場合は、解放時にパイプラインをフラッシュしません。
GLFW_CONTEXT_NO_ERROR は、コンテキストがエラーを生成するかどうかを示します。指定できる値は GLFW_TRUE と GLFW_FALSE です。有効な場合、本来エラーが生成される状況で、代わりに未定義動作が発生します。
GLFW_CONTEXT_ROBUSTNESS は、コンテキストが使う堅牢性戦略を示します。ウィンドウのコンテキストが堅牢性をサポートする場合は GLFW_LOSE_CONTEXT_ON_RESET または GLFW_NO_RESET_NOTIFICATION、それ以外の場合は GLFW_NO_ROBUSTNESS です。
フレームバッファ関連の属性
GLFW はデフォルトフレームバッファ、すなわちウィンドウに接続されたフレームバッファのほとんどの属性を公開しません。これらは OpenGL、OpenGL ES、Vulkan のいずれかで直接取得できるためです。唯一の例外は GLFW_DOUBLEBUFFER です。OpenGL ES がこの情報を提供しないためです。
OpenGL または OpenGL ES のバージョン 3.0 以降を使っている場合は、glGetFramebufferAttachmentParameteriv 関数で赤、緑、青、アルファ、深度、ステンシルの各バッファチャンネルのビット数を取得できます。それ以外の場合は glGetIntegerv 関数を使えます。
MSAA サンプル数は常に glGetIntegerv で取得します。フレームバッファオブジェクトをサポートするコンテキストでは、現在バインドされているフレームバッファのサンプル数が返ります。
| 属性 | glGetIntegerv | glGetFramebufferAttachmentParameteriv |
|---|---|---|
| 赤のビット数 | GL_RED_BITS | GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE |
| 緑のビット数 | GL_GREEN_BITS | GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE |
| 青のビット数 | GL_BLUE_BITS | GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE |
| アルファのビット数 | GL_ALPHA_BITS | GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE |
| 深度のビット数 | GL_DEPTH_BITS | GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE |
| ステンシルのビット数 | GL_STENCIL_BITS | GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE |
| MSAAサンプル数 | GL_SAMPLES | この関数では提供されません |
glGetFramebufferAttachmentParameteriv を呼び出すとき、赤、緑、青、アルファのサイズは GL_BACK_LEFT から取得し、深度とステンシルのサイズはそれぞれ GL_DEPTH と GL_STENCIL のアタッチメントから取得します。
GLFW_DOUBLEBUFFER は、指定したウィンドウが OpenGL または OpenGL ES での描画時にダブルバッファリングされるかどうかを示します。作成前に GLFW_DOUBLEBUFFER ウィンドウヒントで設定できます。
バッファ交換
GLFW のウィンドウはデフォルトでダブルバッファリングされます。つまり、フロントバッファとバックバッファという2つの描画バッファがあります。表示されるのがフロントバッファで、描画先となるのがバックバッファです。
フレーム全体の描画が完了したら、描画した内容を表示して新しいフレームの描画を始めるために、バックバッファとフロントバッファを交換します。これは glfwSwapBuffers で行います。
glfwSwapBuffers(window);バッファ交換の発生時点を選択すると便利な場合があります。glfwSwapInterval 関数を使うと、glfwSwapBuffers を呼び出してからバッファを交換するまでにドライバーが待つべき、モニターの最小リフレッシュ回数を選択できます。
glfwSwapInterval(1);間隔が0の場合、glfwSwapBuffers の呼び出し時にリフレッシュを待たず、直ちに交換します。それ以外の場合は、各バッファ交換の間に少なくとも指定間隔分の垂直帰線が経過します。垂直帰線を待つ時間を測定したくないベンチマークでは、スワップ間隔0が便利です。一方、スワップ間隔1を使うとティアリングを避けられます。
一部のドライバーにはアプリケーションが要求するスワップ間隔を上書きする、ユーザー制御の設定があるため、すべてのマシンで機能するとは限りません。
WGL_EXT_swap_control_tear または GLX_EXT_swap_control_tear 拡張のいずれかをサポートするコンテキストは、_負の_スワップ間隔も受け付けます。これにより、フレームの到着が少し遅れてもドライバーが直ちに交換できます。目に見えるティアリングの危険性と引き換えに、フレームレートの安定性が高まります。これらの拡張は glfwExtensionSupported で確認できます。