質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1644閲覧

GLFW C++ ループ内に入れるべき関数はどれ?

Tololololo

総合スコア118

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/10/02 16:28

編集2018/10/02 16:31

下記のコードで1 ~ 6までコメントで数字を書きました。
その上で2つ疑問があります。

...
...
...

1). 1 ~ 5の関数はそれぞれwhileループ内に入っているものとそうでないものがあります。
ループ内に入れる関数群は下記コードの1 ~ 3(イベント系)まででいいですか?

それとも、windowのサイズや位置に関する関数までループ内に入れるべきですか?

...
...
...

2). 6について。glfwWaitEvents();とglfwPollEvents();の違いはどこにありますか。

一応、質問2コードのような関数をglfwPollEvent状態でmousepressEventトリガーより実行して見たところ、1クリックで描画されたオブジェクトが点滅しました。

waitEventsの場合、Press状態を維持しなければ描画されないという結果でした。

以上のことから、"常に変化する描画をする"ためのPollEventsではないかと仮説を立てていますが正しいですか?

また、これが正しい場合は"点滅する"ということが気がかりです。

一応これも複数回blue関数を実行すると(PollEvents状態で)点滅は見えなくなりました。

すなわち、点滅をなくしたい場合は複数回実行するのも"あり"ってことですか?

C++

1 2/// 質問1 3 4#include <iostream> 5#incl... 6.. 7.. 8.. 9 10int main(){ 11 GLFWwindow* window; 12 13 glfwInit(); 14 window = glfwCreateWindow(windowW, windowH, "んんん、これで良い。", NULL, NULL); 15 glfwMakeContextCurrent(window); 16 17 glfwSetWindowSizeCallback(window, window_size_callback); //4 18 glfwSetWindowPos(window, windowX, windowY); //5 19 20 while (!glfwWindowShouldClose(window)) { 21 glfwSetKeyCallback(window, key_callback); //1 22 glfwSetCursorPosCallback(window, cursor_position_callback); //2 23 glfwSetMouseButtonCallback(window, mouse_button_callback); //3 24 glfwSwapBuffers(window); 25 glfwWaitEvents(); //6 26 } 27 28 glfwTerminate(); 29 return 0; 30} 31

C++

1 2/// 質問2 3 4void blue(void) { 5 6 glClear(GL_COLOR_BUFFER_BIT); 7 8 glBegin(GL_POLYGON); 9 glColor4d(0.0, 0.0, 1.0, 0.3); 10 glVertex2f(-0.1, 0.9); 11 glVertex2f(-0.9, -0.9); 12 glVertex2f(0.3, -0.9); 13 glVertex2f(0.9, 0.9); 14 glEnd(); 15 16 glFinish(); 17 18}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問1の1・2・3のCallback系の関数はウィンドウを生成後1度だけ実行すれば良いのでループ外に書いて下さい。

glfwSetErrorCallback関数(GLFW関数のエラーが発生した時に呼ばれる)のみ
glfwInit関数の前に書くことが出来ます。

C++

1// GLFW library 2#define GLFW_INCLUDE_NONE 3#include <GLFW/glfw3.h> 4... 5 6// GLFWコールバック関数の前方宣言 7void error_callback(int, const char *); 8void framebuffer_size_callback(GLFWwindow *, int, int); 9void key_callback(GLFWwindow *, int, int, int, int); 10 11auto main(int argc, char *argv[]) -> int 12{ 13 // GLFWエラーが発生するたびに呼び出されるコールバック関数 14 glfwSetErrorCallback(error_callback); 15 16 // GLFWライブラリの初期化 17 if (not glfwInit()) 18 { 19 return EXIT_FAILURE; 20 } 21 atexit(glfwTerminate); 22 23 // OpenGLコンテキストの設定 24 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 25 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 26 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 27 glfwWindowHint(GLFW_SAMPLES, 4); 28 29 // ウィンドウの生成 30 auto window = glfwCreateWindow(WINDOW_WIDTH, WIDNWO_HEIGHT, WINDOW_TITLE, 31 nullptr, nullptr); 32 if (window == nullptr) 33 { 34 return EXIT_FAILURE; 35 } 36 glfwMakeContextCurrent(window); 37 glfwSwapInterval(1); 38 39 // コールバック関数の設定 40 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 41 glfwSetKeyCallback(window, key_callback); 42 43 ... 44 45 while (!glfwWindowShouldClose(window)) 46 { 47 // 描画処理 48 glClear(GL_COLOR_BUFFER_BIT); 49 glDrawArrays(GL_TRIANGLES, 0, 3); 50 51 glfwSwapBuffers(window); 52 glfwPollEvents(); 53 } 54 55 ... 56 57 return EXIT_SUCCESS; 58} 59 60void error_callback(int error, const char *description) 61{ 62 fmt::print(stderr, "Error: {}\n", description); 63} 64 65void framebuffer_size_callback(GLFWwindow *window, int width, int height) 66{ 67 glViewport(0, 0, width, height); 68} 69 70void key_callback(GLFWwindow *window, int key, int scancode, int action, 71 int mods) 72{ 73 if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 74 { 75 glfwSetWindowShouldClose(window, GLFW_TRUE); 76 } 77} 78

質問2

glfwPollEvents関数は既にイベントキューに入っているイベントのみを処理して
すぐに元の処理に戻す。

glfwWaitEvents関数はイベントキューに少なくとも1つイベントが入るまでは処理を停止する。
イベントが処理可能な状態になるとglfwPollEventsと同じ様に動作する。

投稿2018/10/02 17:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問