2

私は図書館で学んOpenGLでいglutます。問題は、プログラムが大きくなると、global variables処理するものが非常に多くなることです。多くの人がglobal variablesプログラムであまりにも多くを使うのはノノだと言っているように。ただし、global variablesユーザー定義のパラメーターをglutで定義されたコールバック関数に渡すことでを置き換えることはできません。例えば:

void display (void)
{
   // How to pass user defined parameters here?
   // some more code
}
int
main(void)
{
    glutDisplayFunc(display);
    // some more code
}

だから私の質問はこれです:

  1. glutでOpenGLを書くときにグローバル変数を処理する方法は?
  2. パラメータを関数に渡す代わりに、グローバル変数を置き換える他の方法はありますか?
  3. OpenGLの入出力を処理する他のライブラリ(過剰ではない)はグローバル変数をどのように処理しますか?
4

1 に答える 1

0

「グローバル変数なし」のルールは不完全です。実際の文言は、「関数間でパラメーターを渡すためのグローバル変数はありません」です。ただし、グローバル変数は、グローバルなプログラム全体の状態を保持するのに適しています。

glutでOpenGLを書くときにグローバル変数を処理するには?

管理している状態がプログラム状態である場合、実際にはグローバルは問題ありません。ウィンドウ依存状態は、 を使用して取得できますglutGet。OpenGL 自体が 1 つの大きなグローバル ステート マシンであることを忘れないでください。スレッドごとに 1 つのグローバル OpenGL コンテキストがあり、コンテキストを切り替えると実際にグローバル変数が変更されます。

レンダリングに関連するものに GLUT reshape 関数を使用しないでください。つまり、reshape でビューポートと投影を設定しないでください。表示機能で行います。

パラメータを関数に渡す代わりに、グローバル変数を置き換える他の方法はありますか

ffcallライブラリを使用して、パラメーター化された関数を GLUT に渡すことができるクロージャーに変換するなど、いくつかの方法があります。

OpenGL の入出力を処理する他のライブラリ (glut ではない) は、グローバル変数をどのように処理しますか?

コールバック関数にデータ パラメータを渡すことを許可するか (GLUT での大きな設計上の失敗、それを許可しない)、またはコールバックの代わりにメッセージ/シグナル ベースのシステムを使用します。

于 2012-04-18T10:40:22.493 に答える