2011-04-16 42 views
1

当试图在OpenGL中使用顶点数组(而不是立即模式渲染)绘制以下四边形时,我会看到图片中显示的图形毛刺(线段) ,可以在下面的第二个链接中找到。这条线似乎向上延伸到无穷大。OpenGL:使用顶点数组绘制立方体会导致图形故障

GLdouble vertices[] = { 
    // back 
    0.0, 0.0, 0.0, 
    si, 0.0, 0.0, 
    si, -si, 0.0, 
    0.0, -si, 0.0, 

    // front 
    0.0, 0.0, si, 
    0.0, -si, si, 
    si, -si, si, 
    si, 0.0, si, 

    // left 
    0.0, 0.0, 0.0, 
    0.0, -si, 0.0, 
    0.0, -si, si, 
    0.0, 0.0, si, 

    // right 
    si, 0.0, 0.0, 
    si, 0.0, si, 
    si, -si, si, 
    si, -si, 0.0, 

    // top 
    0.0, 0.0, 0.0, 
    0.0, 0.0, si, 
    si, 0.0, si, 
    si, 0.0, 0.0, 

    // bottom 
    0.0, -si, 0.0, 
    si, -si, 0.0, 
    si, -si, si, 
    0.0, -si, si, 
}; 

立即附图中:

glBegin(GL_QUADS); 
    for (int i = 0; i < sizeof(vertices)/sizeof(*vertices)/3; i++) 
    glVertex3d(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2]); 
glEnd(); 

绘制与顶点数组:

glVertexPointer(3, GL_DOUBLE, 0, vertices); 
glDrawArrays(GL_QUADS, 0, sizeof(vertices)/sizeof(*vertices)); 

图片:

Correct cube drawn in immediate mode

Glitchy cube drawn with vertex array

我在做什么错?

回答

5

试着改变你的平局

glVertexPointer(3, GL_DOUBLE, 0, vertices); 
glDrawArrays(GL_QUADS, 0, 24); 

的sizeof()不工作,你觉得它的方式。它不会返回数组中元素的数量。您需要以某种方式记录该数组中顶点的数量,然后在您的glDrawArrays调用中使用该计数器。

编辑 - 信息

在调用glDrawArrays最后一个参数是要渲染的顶点数量。 sizeof(vertices)应返回GLdouble *(4字节)中的字节数,sizeof(vertices *)应返回GLdouble(8字节)中的字节数。然后4/8应该在技术上归零,因为它们是整数,所以我不确定它为什么呈现任何东西。

但是,我非常肯定(假设你的顶点已经正确完成),如果你把这个数字改成24,它就会起作用。

+0

他们使用它的方式,它会给他数组中的元素数量。只是不是顶点的数量,因为元素是单浮点数。修正是正确的。 – ltjax 2011-04-16 16:16:36

+1

哦,我明白了。所以它返回的是浮点数,但不是顶点的数量。因此,因为每个顶点有3个浮点数,所以它返回72而不是24. – 2011-04-16 16:20:41

+0

这意味着我对sizeof的理解有点偏离,sizeof(指针对双精度)/ sizeof(*指针对双精度)''返回数组元素的数量? – 2011-04-16 16:23:00