调用glDrawElements glInterleavedArrays不工作

问题描述:

我写一些openGL的包装,我试图运行下面的代码:调用glDrawElements glInterleavedArrays不工作

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渲染问题。 (不确定是否有任何问题,但是... :))

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

因此,要么让这个阵列在glDrawElements调用之前存活,要么通过使用vertex buffer object并执行实际的数据复制,甚至更好地使OpenGL实际存储顶点数据本身。在这种情况下,您可能还想避免使用已过时的glInterleavedArrays函数(无论如何,它仅仅是围绕正确的gl...PointerglEnableClientState调用进行的软件封装)。

+0

啊哈,这是我的理解,'glnterleavedArrays'实际上确实存储在缓冲区中的数组。这非常合理。谢谢! – trlemburg

+0

@trlemburg但最终如何呢。你不告诉它任何大小,它应该怎么知道要复制什么? –