2012-04-18 8 views
2

glutライブラリでOpenGLを学習しています。問題は、プログラムが大きくなると処理する数字が非常に多いことです。多くの人が言っているように、プログラムではあまりにも多くの数字を使用するのはノンです。しかし、私はglobal variablesの代わりに、glutで定義されたコールバック関数にユーザ定義のパラメータを渡すことはできません。たとえば:glut(またはfreeglut)でOpenGLを書くときのグローバル変数の処理

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の入出力を扱う他のライブラリ(glut)は、グローバル変数をどのように扱いますか?

答えて

1

"グローバル変数がありません"というルールは不完全です。実際の表現は、「関数間でパラメータを渡すためのグローバル変数はありません」です。しかし、グローバル変数は、プログラム全体の広域的な状態を保持するためには問題ありません。

glutを使用してOpenGLを書き込むときのグローバル変数の扱い方は?

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

レンダリングに関連するものにはGLUTリサーブ機能を使用しないでください。すなわち、ビューポートと投影を変形で設定しないでください。表示機能で行います。

いることができます閉鎖にparametized機能をオンにするffcallライブラリを使用してのようないくつかの方法がありますが、代わりに機能

にパラメータを渡すのグローバル変数を置換する他の方法がありますGLUTに渡す。

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

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

+0

実際には、関数間に多くのグローバル変数を渡す必要があります。たとえば、グローバル変数として定義された 'stepsize'の値を変更し、' keyboard'コールバック関数で処理するスペースキーを押すと、ビューアとオブジェクト(例えば)との間の距離を変更するために 'stepsize'を' display'コールバック関数に渡す必要があります。もう一つの例は、 'display()'関数に渡すためにグローバルでなければならないテクスチャオブジェクト( 'init()'関数内で)を初期化するときです。それは正しく処理されますか?またはより良い解決策がありますか? – toolchainX

+0

@ tlh1987:コールバック関数は表示するデータを渡すべきではなく、プログラムの状態を変更する必要があります。そして、プログラム状態は、定義上、グローバルである。関数のパラメータ化によってプログラムの状態を効果的に管理するためには、本当に機能的な言語(Lisp、Scheme、OCaml、Haskellなど)が必要です。しかし、Cは大部分が不可欠です。あなたはどこかのグローバルな状態を持つことになります。 – datenwolf

+0

ええと...実際、私は 'プログラム状態の変更'の意味を理解していませんでした。キーボードコールバック関数の 'プログラム状態'の変更方法はわかりません。グローバル変数を扱う私の以前のコメントが良い考えではないので、実用的な解決策を教えてください。私はOpenGLに関する赤い本を読んだだけで、機能的な言語についてあまり知らない。 – toolchainX

関連する問題