0

我正在编写一些 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 不起作用的任何原因,或者如果在另一个函数中调用会以某种方式丢失数据。有任何想法吗?

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

4

1 回答 1

1

原因是,在用 绘制时glDrawElements,没有要绘制的有效顶点数据。调用时glInterleavedArrays(只是在后台进行了一堆gl...Pointer调用),您只是告诉 OpenGL 在哪里可以找到顶点数据,而无需复制任何内容。在绘图操作 ( ) 之前不会访问实际数据glDrawElements。因此,some_func1您正在设置一个指向局部变量的指针,该指针vertices在函数返回后不再存在。这不会发生在您修改过的代码中(在同一函数中设置和绘制指针)。

所以要么让这个数组在glDrawElements调用之前一直存在,或者更好的是,让 OpenGL 通过使用顶点缓冲区对象并执行实际的数据复制来实际存储顶点数据本身。在这种情况下,您可能还想避免使用被严重弃用的glInterleavedArrays功能(无论如何,这只不过是一个简单的软件包装器gl...Pointer而已glEnableClientState)。

于 2013-01-08T16:08:16.113 回答