glInterleavedArrays后无法调用glDrawElements

时间:2013-01-08 15:54:14

标签: c opengl

我正在编写一些openGL包装器,并尝试运行以下代码:

void some_func1() {
    float vertices[] = {50.0, 50.0, 0.0, 20.0, 50.0, 0.0, 20.0, 60.0, 0.0};
    glColor3f(1.0, 0.0, 0.0);
    glInterleavedArrays(GL_V3F, 0, vertices);
}

void some_func2() {
    int indices[] = {0,1,2};
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
}

void parent_func() {
    some_func1();
    some_func2();
}

但似乎openGL没有在第二个函数中调用glDrawElements。我的例程打开一个窗口,将其清除为黑色,并且不绘制任何内容。有什么奇怪的是运行这段代码

void some_func1() {
    float vertices[] = {50.0, 50.0, 0.0, 20.0, 50.0, 0.0, 20.0, 60.0, 0.0};
    int indices[] = {0,1,2};
    glColor3f(1.0, 0.0, 0.0);
    glInterleavedArrays(GL_V3F, 0, vertices);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices);
}

void parent_func() {
    some_func1();
}

完全按预期工作:绘制一个红色三角形。我查看了文档并进行了搜索,但是我找不到glDrawElements不起作用的任何原因,或者如果在另一个函数中调用,会以某种方式错过数据。有任何想法吗?

仅供参考:我通过VirtualBox,主机上的32位处理器在Ubuntu 12.04 VM上运行它,freeglut正在处理我的窗口。我还设置了LIBGL_ALWAYS_INDIRECT = 1来解决VM的3D渲染问题。 (不确定是否有任何重要,但...... :))

1 个答案:

答案 0 :(得分:1)

原因是,在使用glDrawElements进行绘制时,没有有效的顶点数据可供绘制。当调用glInterleavedArrays(它只是在引擎盖下进行一堆gl...Pointer调用时)你只是告诉OpenGL在哪里找到顶点数据,而不复制任何东西。在绘制操作(glDrawElements)之前不访问实际数据。所以在some_func1中你设置了一个指向局部变量vertices的指针,该函数在函数返回后不再存在。在修改后的代码中不会发生这种情况(指针设置并在同一函数中绘制)。

因此要么让这个数组存活到glDrawElements调用,要么更好,使OpenGL实际存储顶点数据本身,使用vertex buffer object并执行实际数据复制。在这种情况下,您可能还想避免使用非常弃用的glInterleavedArrays函数(这不仅仅是围绕正确gl...PointerglEnableClientState调用的纯软件包装器。“ / p>