ゲームグラフィックス特論
ggsample01.cpp
[詳解]
1 // Dear ImGui を使う
2 #define USE_IMGUI
3 
4 // ウィンドウ関連の処理
5 #include "Window.h"
6 
7 // 光源データ
9 {
10  { 0.2f, 0.2f, 0.2f, 1.0f }, // 環境光成分
11  { 1.0f, 1.0f, 1.0f, 0.0f }, // 拡散反射光成分
12  { 1.0f, 1.0f, 1.0f, 0.0f }, // 鏡面反射光成分
13  { 0.0f, 0.0f, 1.0f, 1.0f } // 光源位置
14 };
15 
16 //
17 // アプリケーション本体
18 //
19 void app()
20 {
21  // ウィンドウを作成する
22  Window window("ggsample01");
23 
24  // シェーダを作成する
25  const GgSimpleShader simple("simple.vert", "simple.frag");
26 
27  // 図形データを読み込む (大きさを正規化する)
28  const GgSimpleObj object("logo.obj", true);
29 
30  // 光源データから光源のバッファオブジェクトを作成する
31  const GgSimpleShader::LightBuffer lightBuffer(light);
32 
33  // ビュー変換行列を設定する
34  const GgMatrix mv(ggLookat(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f));
35 
36 #ifdef USE_IMGUI
37  //
38  // ImGui の初期設定
39  //
40 
41  //ImGuiIO& io = ImGui::GetIO();
42  //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
43  //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
44 
45  // Setup Dear ImGui style
46  //ImGui::StyleColorsDark();
47  //ImGui::StyleColorsClassic();
48 
49  // Load Fonts
50  // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
51  // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
52  // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
53  // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
54  // - Read 'docs/FONTS.txt' for more instructions and details.
55  // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
56  //io.Fonts->AddFontDefault();
57  //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
58  //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
59  //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
60  //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f);
61  //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
62  //IM_ASSERT(font != NULL);
63 #endif
64 
65  // 背景色を設定する
66  glClearColor(0.1f, 0.2f, 0.3f, 0.0f);
67 
68  // 隠面消去処理を設定する
69  glEnable(GL_DEPTH_TEST);
70  glEnable(GL_CULL_FACE);
71 
72  // ウィンドウが開いている間繰り返す
73  while (window)
74  {
75  // ウィンドウを消去する
76  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
77 
78  // オブジェクトのモデル変換行列を設定する
79  GgMatrix mm(window.getTrackball());
80 
81 #ifdef USE_IMGUI
82  //
83  // ImGui によるユーザインタフェース
84  //
85 
86  // オブジェクトのオイラー角
87  static float roll, pitch, yaw;
88 
89  // ImGui のフレームを準備する
90  ImGui::NewFrame();
91 
92  // ImGui のフレームに一つ目の ImGui のウィンドウを描く
93  ImGui::Begin("Control panel");
94  ImGui::Text("Frame rate: %6.2f fps", ImGui::GetIO().Framerate);
95  ImGui::SliderAngle("Roll", &roll);
96  ImGui::SliderAngle("Pitch", &pitch);
97  ImGui::SliderAngle("Yaw", &yaw);
98  if (ImGui::Button("Quit")) window.setClose();
99  ImGui::End();
100 
101  // モデル変換行列にオイラー角を乗じる
102  mm = mm.rotateY(yaw).rotateX(pitch).rotateZ(roll);
103 #endif
104 
105  // 投影変換行列を設定する
106  const GgMatrix mp(ggPerspective(0.5f, window.getAspect(), 1.0f, 15.0f));
107 
108  // シェーダプログラムを指定する
109  simple.use(mp, mv * mm, lightBuffer);
110 
111  // 図形を描画する
112  object.draw();
113 
114 #ifdef USE_IMGUI
115  // ImGui のフレームに描画する
116  ImGui::Render();
117 #endif
118 
119  // カラーバッファを入れ替えてイベントを取り出す
120  window.swapBuffers();
121  }
122 }
ゲームグラフィックス特論の宿題用補助プログラムのウィンドウ関連の処理.
ウィンドウ関連の処理.
Definition: Window.h:89
GLfloat getAspect() const
ウィンドウのアスペクト比を得る.
Definition: Window.h:1296
void setClose(int flag=GLFW_TRUE) const
ウィンドウのクローズフラグを設定する.
Definition: Window.h:1184
GgMatrix getTrackball(int button=GLFW_MOUSE_BUTTON_1) const
トラックボールの回転変換行列を得る.
Definition: Window.h:1554
void swapBuffers()
カラーバッファを入れ替える.
Definition: Window.h:1251
変換行列.
Definition: gg.h:1655
GgMatrix rotateZ(GLfloat a) const
z 軸中心の回転変換を乗じた結果を返す.
Definition: gg.h:2210
GgMatrix rotateX(GLfloat a) const
x 軸中心の回転変換を乗じた結果を返す.
Definition: gg.h:2192
GgMatrix rotateY(GLfloat a) const
y 軸中心の回転変換を乗じた結果を返す.
Definition: gg.h:2201
Wavefront OBJ 形式のファイル (Arrays 形式).
Definition: gg.h:5764
三角形に単純な陰影付けを行うシェーダが参照する光源データのユニフォームバッファオブジェクト.
Definition: gg.h:5298
三角形に単純な陰影付けを行うシェーダ.
Definition: gg.h:5156
void use() const
シェーダプログラムの使用を開始する.
Definition: gg.h:5592
GgSimpleShader::Light light
Definition: ggsample01.cpp:8
void app()
Definition: ggsample01.cpp:19
GgMatrix ggLookat(GLfloat ex, GLfloat ey, GLfloat ez, GLfloat tx, GLfloat ty, GLfloat tz, GLfloat ux, GLfloat uy, GLfloat uz)
ビュー変換行列を返す.
Definition: gg.h:2604
GgMatrix ggPerspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)
画角を指定して透視投影変換行列を返す.
Definition: gg.h:2682
三角形に単純な陰影付けを行うシェーダが参照する光源データ.
Definition: gg.h:5286