我正在编写一些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渲染问题。 (不确定是否有任何重要,但...... :))
答案 0 :(得分:1)
原因是,在使用glDrawElements
进行绘制时,没有有效的顶点数据可供绘制。当调用glInterleavedArrays
(它只是在引擎盖下进行一堆gl...Pointer
调用时)你只是告诉OpenGL在哪里找到顶点数据,而不复制任何东西。在绘制操作(glDrawElements
)之前不访问实际数据。所以在some_func1
中你设置了一个指向局部变量vertices
的指针,该函数在函数返回后不再存在。在修改后的代码中不会发生这种情况(指针设置并在同一函数中绘制)。
因此要么让这个数组存活到glDrawElements
调用,要么更好,使OpenGL实际存储顶点数据本身,使用vertex buffer object并执行实际数据复制。在这种情况下,您可能还想避免使用非常弃用的glInterleavedArrays
函数(这不仅仅是围绕正确gl...Pointer
和glEnableClientState
调用的纯软件包装器。“ / p>