1

私はOpenGlを学び、プリミティブリスタートインデックスがどのように機能するかについての簡単なテストを実装しようとしています。何を試しても、g++では「`__glewPrimitiveRestartIndex'への未定義の参照」というエラーが表示されます。

問題のコードは次のとおりです。

#include <GL/glew.h>
#include <GL/freeglut.h>

static GLfloat vertices[] = {0.0, 0.0, 0.0, 5.0, -5.0, 0.0,
0xffff, 0.0, -10.0, 5.0, -15.0, 6.0, -8.0};

void init(void)
{
    glEnable(GL_PRIMITIVE_RESTART);
    glPrimitiveRestartIndex(0xffff);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, vertices);
}

私はg++の使用に少し慣れておらず、その切り替えとインクルードメカニズムを完全には理解していないことを認めます。コンパイルに使用しているg++コマンドは次のとおりです。g++-otest test.cpp -lGL -lglut

コマンドに「-lGLEW」を追加すると、プログラムはコンパイルされますが、セグメンテーション違反が発生します。「glPrimitiveRestartIndex(0xffff);」という行を削除します コードから、-lGLEWがコンパイルコマンドに追加された場合、エラーなしで(もちろん、プリミティブ再起動インデックスが機能せずに)コンパイルおよび実行されますが、なしで試行した場合も同じエラーが発生します。

これにより、最初の問題は-lGLEWが含まれていないことが原因であると私は信じています。したがって、残っている唯一の問題は、なぜ私がセグメンテーション違反を渡されているのかを理解することです。0xffff以外のさまざまな値で試しましたが、問題は解決していません。

4

2 に答える 2

3

実際にロードするまで、OpenGL 関数を呼び出さないでください。GLEW を使用しているため、GL 関数を呼び出す前に GLEW の初期化ルーチンを使用する必要があります。詳細については、GLEW のドキュメントを参照してください。


ああ、それはプリミティブ再起動の仕組みではありません。再起動インデックスはインデックスであり、頂点の位置ではありません。それはあなたが与えるもの、あなたのインデックスのリストに入るはずですglDrawElements。インデックスのリストがなく、 で描画しているglDrawArrays場合は、プリミティブ リスタートを使用できません。

于 2011-07-23T21:25:59.350 に答える
1

これにより、最初の問題は -lGLEW が含まれていなかったことが原因であると信じるようになりました。したがって、残っている唯一の問題は、セグメンテーション違反が発生した理由を突き止めることです。0xffff 以外の値を試してみましたが、問題は残ります。

問題は渡す値ではありませんが、GLEW が初期化されていないためglPrimitiveRestartIndex、無効なポインターとそれを逆参照/呼び出ししようとすると、未定義の動作が発生します。OpenGL コンテキストを作成して現在の状態にした後、GLEW を初期化する必要があります。GLUT が使用されている場合、これは を呼び出した後glutCreateWindowであるため、コードは次のようになります。

glutCreateWindow("...");
glewInit();

また、目的の拡張機能が実際に存在するかどうかを確認する必要があります。そして、@Nicol Bolas がすでに言ったように、プリミティブ開始インデックスは に渡されたインデックス配列に入りglDrawElementsます。

于 2011-07-23T21:30:44.327 に答える