使用OpenGL的C ++中的原始重启索引错误

时间:2011-07-23 21:03:11

标签: c++ opengl glew

我只是在学习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 ++ -o test test.cpp -lGL -lglut

在命令中附加“-lGLEW”后,程序会编译,但是会给我一个段错误。删除行“glPrimitiveRestartIndex(0xffff);”从代码开始编译和运行时没有错误(当然,没有原始重启索引工作)当-lGLEW被附加到编译命令时,但在没有错误的情况下提出同样的错误。

这让我相信最初的问题是因为没有包含-lGLEW - 因此唯一剩下的问题就是弄清楚为什么我被交给了段错误。我尝试过除0xffff以外的其他值,但问题仍然存在。

2 个答案:

答案 0 :(得分:3)

在实际加载OpenGL函数之前,不应该调用OpenGL函数。由于您使用的是GLEW,因此在调用GL函数之前应使用GLEW的初始化例程。有关详细信息,请参阅GLEW的文档。


哦,这不是原始重启的原理。重启索引是索引,而不是顶点位置。它应该放在你的索引列表中,你给glDrawElements的内容。如果您没有索引列表并且使用glDrawArrays绘图,则无法使用原始重启。

答案 1 :(得分:1)

  

这让我相信最初的问题是因为没有包含-lGLEW - 因此唯一剩下的问题就是弄清楚为什么我被交给了段错误。我尝试过除0xffff以外的其他值,但问题仍然存在。

问题不在于您传递的值,而是GLEW未初始化,因此glPrimitiveRestartIndex无效指针并尝试取消引用/调用它将导致未定义的行为。您必须在创建并创建当前OpenGL上下文后初始化GLEW。在使用GLUT的情况下,这是在调用glutCreateWindow之后,因此您的代码应该有点像这样:

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

此外,您还必须检查所需的扩展名是否确实存在。就像@Nicol Bolas已经告诉过你的那样,原始的起始索引会进入传递给glDrawElements的索引数组。