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

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

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

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

C++

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

Q&A

解決済

2回答

3832閲覧

OpenGLの仕様(glutInit(&argc, argv)など)を教えてください

hikar

総合スコア13

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/02/07 03:00

編集2020/02/08 23:26

OpenGLでグラフィカルコンソールを作っています。
グラフィカルコンソールを作る際はmainの引数はint main(int argc, char* argv[])のように書くと教えていただき、私もそのように使うんだな~と、疑問はありましたが、そのように使ってきました。
ですが、わからないものをそのままにしておくのも気持ち悪いので、ネットで調べてみました。
調べてみた結果、コマンドラインというものがあり、プログラムに対して「何を・どのように」処理するかを支持するものと知りました。

int argc : int型変数・これは次の配列argvの要素数が格納されている。
char *argv[] : 実際に受け取ったコマンドライン引数の文字列が配列で格納されている。

glutInitはウィンドウを表示するためOpenGLを初期化する関数だとはわかっているのですが、
その場合、OpenGLの「glutInit(&argc, argv);」はどのような処理をしているのでしょうか?

それと、下のソースコードがループになるのは、「glutMainLoop();」でウィンドウが破棄されるまで処理がもどってこないためでよろしいでしょうか?
そして、「glutMainLoop();」内では「glutDisplayFunc(display);」「glutTimerFunc()」が状況によって処理されるのでしょうか?
「glutTimerFunc()」が1秒に1回よびだされ、glutTimerFunc()内の「glutPostRedisplay();」によってOpenGLに再描画が必要であると訴え、「glutDisplayFunc」が呼び出されるのでしょうか?

初歩的な質問になってしまいますが、どなたかわかる方教えてください<(_ _)>

C++

1#include "glut.h" 2 3void display(void) { 4 glClear(GL_COLOR_BUFFER_BIT); 5 glRotatef( 6 1, // GLfloat angle 7 0,0,1); // GLfloat x, y, z 8 9 glutWireTeapot(0.5); 10 glFlush(); 11} 12 13void timer(int value) { 14 glutPostRedisplay(); 15 16 glutTimerFunc( // 一定時間が経過するとコールバック関数を呼び出す 17 1000/60, // unsigned int millis 18 timer, // void (GLUTCALLBACK *func)(int value) 19 0); // int value 20} 21 22int main(int argc, char* argv[]) { 23 glutInit(//ウィンドウを表示させるため、GLUTを初期化 24 &argc, 25 argv); 26 glutCreateWindow("Title"); 27 glutDisplayFunc(display);//void (GLUTCALLBACK *func)(void) 28 glutTimerFunc( // 一定時間が経過するとコールバック関数を呼び出す 29 1000/60, // unsigned int millis 30 timer, // void (GLUTCALLBACK *func)(int value) 31 0); // int value 32 33 glutMainLoop(); 34}

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

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

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

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

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

guest

回答2

0

ベストアンサー

タグにOpenGLを追加した方がいいのと、質問のタイトルも変更した方がいいですね。

現在のタイトルとタグだけだと、純粋なC++の質問だとみなされて、肝心のOpenGLの質問だということに気づかれないまま放置されるかもしれません。

OpenGLもGLUTも1996年の赤本でちょっとかじった程度ですが...
ご質問の内容は概ね合っていると思います。

int argc : int型変数・これは次の配列argvの要素数が格納されている。
char *argv[] : 実際に受け取ったコマンドライン引数の文字列が配列で格納されている。

char *argv[]はもう少し正確にいうと、「コマンドライン引数の文字列へのポインタ」ですね。

argv[0]は実行形式の名前そのものを表す文字列へのアドレス、argv[1]は第一引数の文字列へのアドレス、以下第二引数...と続き、最後はNULLで終ります。

もし引数がなければ、argv[1]NULLです。

その場合、OpenGLの「glutInit(&argc, argv);」はどのような処理をしているのでしょうか?

glutInit()関数の処理ですが、これはmaisumakunさんがご指摘されている公式リファレンスに載っている通りです。

この公式リファレンスには、実行時の引数で指定できるオプション一覧が載せてありますが、それらを実際に分解し、必要に応じた処理を行うのがglutInit()関数です。もちろん、この関数はWindowの作成などの処理も行います。

なので、main()関数に渡された引数を「そのままの形」で渡す必要があります。

glutInit(&argc, argv)を実行したあとは、glutInit()で処理されなかった引数で書き換わったargc*argv[]が戻ってきたはずです。

もし、質問者さんが独自のコマンドライン引数を追加したのであれば、gluiInit()関数のあとに引数を処理するコードや関数を入れる必要があります。

それと、下のソースコードがループになるのは、「glutMainLoop();」でウィンドウが破棄されるまで処理がもどってこないためでよろしいでしょうか?

glutMainLoop()は呼び出されたあとは戻ってくることはありません。

試しに、

c

1 glutMainLoop(); 2 3 printf("END\n");

のように、glutMainLoop()関数のあとに何らかの処理を行う関数をいれてみて、動作を確かめると良いと思います。
もし、glutMainLoop()のあとに処理が行われるのであれば、続くprintf()の処理も行われるはずです。

そして、「glutMainLoop();」内では「glutDisplayFunc(display);」「glutTimerFunc()」が状況によって処理されるのでしょうか?

その理解で良いと思います。

このほかにもマウスやキーボードなどの入力処理を扱う関数もありますので、調べてみると良いと思います。

「glutTimerFunc()」が1秒に1回よびだされ、glutTimerFunc()内の「glutPostRedisplay();」によってOpenGLに再描画が必要であると訴え、「glutDisplayFunc」が呼び出されるのでしょうか?

1秒に一回ではなく、1000/60 ミリ秒に一回ですね。

もし1秒に一回であれば、更新速度はえらく遅くなるはずです。

これも、引数を1000(ミリ秒)にしたり、100(ミリ秒)にするなどして試してみると良いと思います。

この文献は関連情報もふくめて充実していそうなので、興味があったらみてみてください。

投稿2020/02/07 13:38

TsukubaDepot

総合スコア5086

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

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

hikar

2020/02/08 23:23

ご返答ありがとうございました。とてもわかりやすかったです。<(_ _)> 「手抜きOpenGL」「7、マウスとキーボード」まで拝見させていただきました。 他の資料と違い、細かいところまで説明されていて、とてもわかりやすかったです。 わからないことがあったら、教えていただいた資料を参考にさせていただきます。 切羽詰まってしまったら、またこちらのサイトを利用させていただきます。その時はまた、よろしくお願いします。
guest

0

OpenGLの「glutInit(&argc, argv);」はどのような処理をしているのでしょうか?

GLUTライブラリ自体がコマンドライン引数を認識するので、その処理を行う、とのことです(OpenGL公式)。

投稿2020/02/07 03:02

maisumakun

総合スコア146018

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

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

hikar

2020/02/08 22:30

返信ありがとうございました。 参考にさせていただきます。(>_<)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問