1

我只是在学习 OpenGl 并尝试对 Primitive Restart Index 如何工作进行简单的测试。无论我尝试什么,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++ 有点陌生,并不完全理解它的 switch 和 include 机制。我用来编译它的 g++ 命令如下: g++ -o test 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 回答