#GLFW
OpenGLを使った開発を始めたいと思っても,描画するウィンドウがないとスタートにすら立てません.
今回は割と簡単にウィンドウ作成・イベント処理などができるGLFW(openGL FrameWork)というライブラリを使っていきます.
Qtはちょっと,面倒なので….
この記事では,まずウィンドウを表示するモニタの情報を取得する部分を書いていきたいと思います.
#ソースコード
- https://github.com/loser4dim/3D_ModelViewer/blob/master/3D_ModelViewer/SilverFox/Monitor.hpp
- https://github.com/loser4dim/3D_ModelViewer/blob/master/3D_ModelViewer/SilverFox/Monitor.cpp
#クラスの分け方について
GLFWで処理する部分について,どこをどのようにクラスで分けようかと悩みましたが,ある程度,処理の区切りがよさげなところでクラスを分けています.
毎回GUI周りのクラスとその関連図の作成に悩むので,その辺に強い方がいらっしゃれば教えてほしいです.
#モニタ情報の取得
ここでは,Monitorクラスを作成して,モニタの情報を取得したいと思います.
以下がヘッダです.
#pragma once
#include <GLFW/glfw3.h>
#pragma comment(lib, "glfw3")
#include <memory>
#include <array>
class alignas(sizeof(float_t)) Monitor final{
public:
Monitor() noexcept(false);
Monitor(const Monitor&) = delete;
Monitor(Monitor&&) = delete;
Monitor& operator=(const Monitor&) = delete;
Monitor& operator=(Monitor&&) = delete;
~Monitor() noexcept(false);
private:
static void callbackMonitor(GLFWmonitor* const monitor, const int event) noexcept;
private:
GLFWmonitor* primary_monitor_ = nullptr;
GLFWvidmode current_video_mode_;
float_t physical_width_ = 0.0f;
float_t physical_height_ = 0.0f;
std::array<float, 2> content_scale_;
std::array<std::array<int, 2>, 2> workarea_;
public:
const GLFWvidmode& getVideoMode() const noexcept{
return current_video_mode_;
}
};
手順は結構単純です.
- GLFWmonitor* 型のインスタンスを取得
- ビデオモード取得
必要なことはこれだけです.
1のインスタンスを取得ですが,glfwGetMonitors関数で,複数のモニタ情報を取得することもできます.
ですが,とりあえずメインのモニタの情報を抜いてくるだけなら,glfwGetPrimaryMonitor関数を使うだけでOKです.
2についても,glfwGetVideoMode関数を使うだけでOKです.
これの戻り値であるGLFWvidmode構造体には,以下のような情報を含んでいます.
- モニタの画面の解像度[px]
- RGBのビット深度
- リフレッシュレート
これで,モニタから必要な情報を取得することができます.
他にもできることとしては,
- モニタ接続・切断のコールバック関数の設定
- モニタの物理的なサイズ[mm]の取得
- DPIの計算
- $\gamma$ ランプの設定
などがあります.
多少はgithubにアップロードしたコードでも使用していますが,詳細は公式のリファレンスを見るのが早いと思います.
https://www.glfw.org/docs/latest/group__monitor.html