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

Posted

技术标签:

【中文标题】使用 OpenGL 的 C++ 中的原始重启索引错误【英文标题】:Primitive Restart Index error in C++ with OpenGL 【发布时间】:2011-07-23 21:03:10 【问题描述】:

我只是在学习 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 以外的其他值,但问题仍然存在。

【问题讨论】:

【参考方案1】:

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


哦,这不是原始重启的工作方式。重启索引是一个index,而不是一个顶点位置。它应该在你的索引列表中,你给glDrawElements 的东西。如果您没有索引列表并且使用glDrawArrays 进行绘图,则不能使用原始重启。

【讨论】:

【参考方案2】:

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

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

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

您还必须检查您想要的扩展是否真的存在。就像@Nicol Bolas 已经告诉你的那样,原始起始索引进入传递给glDrawElements 的索引数组。

【讨论】:

以上是关于使用 OpenGL 的 C++ 中的原始重启索引错误的主要内容,如果未能解决你的问题,请参考以下文章

如何声明和使用作为 OpenGL 中原始元素数组的顶点属性

OpenGL 是如何实际读取索引的?

在使用 QOpenGLFunctions 时将 OpenGL 功能封装在 C++ 对象中

c++:如何使用 sdl 将位图加载到 opengl 中的多维数据集中?

使用 C++ 在 OpenGL 中的动画点?

索引顺序影响 OPENGL 中的立方体结构