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