7

何もしない基本的な draw() メソッドで仮想クラスを作成しました。これの目的は、OpenGL で自分自身を描画できる他のクラス、シェイプ、およびその他のものに、この仮想クラスを継承させて、多くの異なるクラスへのポインターの配列を作成できるようにすることです。この背後にあるアイデアは、この配列へのポインターを glutDisplayFunc コールバックに渡すことができることを望んでいたことです。(これはたまたま drawScene() という名前になっています。残念ながら、glutDisplayFunc はパラメーターをとらず、何も返さないメソッドを取るように設計されているため、何も渡すことができないようです。

引数をコールバック関数に渡し、ポインタを drawScene 関数に渡す方法はありますか?

(TLDR? 以下を参照してください。)

基本的に私はこれを行うことができるようにしたい:

class a{ ... };
void drawScene( a** a_array_pointer){ ... }
glutDisplayFunc(drawScene); // <-- How do I pass an argument into this?
4

4 に答える 4

1

drawScene をポインターでパラメーター化する必要があります。

#include <GL/glut.h>

template <void *T>
void drawScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if (T == (void *)0) {
        /* handle no array */
    } else {
        /* handle array */
    }
    glutSwapBuffers();
} 

int main(int argc, char **argv)
{
    glutDisplayFunc(drawScene<(void *)0>);

    return 0;
}

これはコンパイル時にのみ機能します。実行時に drawScene の動作を変更する必要がある場合は、別のモジュールを再コンパイルし、LoadLibrary/GetProcAddress を使用してそれをロードしてポインターを変更するか、スレッド ローカル ストレージとおそらくロックを使用する必要があります。

ディスプレイの引数がないため、複数のスレッドで実行時にディスプレイの動作を変更すると、ロックや複雑な代替手段が必要になるため、非常にコストがかかるため、これは過剰の主要な欠陥の 1 つです。

于 2017-12-26T22:54:40.320 に答える
1

引数をコールバック関数に渡し、ポインタを drawScene 関数に渡す方法はありますか?

いいえ、glutは実際にはCライブラリであり、glutDisplayFuncパラメータとして関数ポインタを期待しています。そのコールバックで変数を使用する唯一の方法は、変数をクラスのグローバル変数または静的変数にすることです。

于 2012-09-06T12:04:56.930 に答える
0

残念ながら、それは不可能です。glutDisplayFunc引数を持たない関数へのポインターが必要です。マニュアルページを参照してください。

于 2012-09-06T11:53:10.517 に答える
0

これは、グローバル変数を使用する必要があるケースの 1 つです。

参照: C++ と openGL で別の関数の引数としてクラス メソッドを渡す方法は?

于 2012-09-06T11:53:38.020 に答える