使用 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++ 中的原始重启索引错误的主要内容,如果未能解决你的问题,请参考以下文章
在使用 QOpenGLFunctions 时将 OpenGL 功能封装在 C++ 对象中