OpenGL:使用顶点数组绘制立方体会导致图形故障

OpenGL:使用顶点数组绘制立方体会导致图形故障,opengl,vertex-array,Opengl,Vertex Array,当尝试在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,

当尝试在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, 24);
sizeof()的工作方式与您认为的不同。它不返回数组中的元素数。您需要以某种方式跟踪该数组中的顶点数,然后在glDrawArrays调用中使用该计数器

编辑-更多信息:

GLDrawArray中的最后一个参数是渲染的顶点数。sizeof(顶点)应返回GLdouble*中的字节数(4字节),sizeof(顶点*)应返回GLdouble中的字节数(8字节)。那么从技术上讲,4/8应该四舍五入为零,因为它们是整数,所以我不确定它为什么渲染任何东西


但是,我非常确定(假设顶点正确完成),如果将该数字更改为24,它将起作用。

尝试将绘图更改为

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, 24);
sizeof()的工作方式与您认为的不同。它不返回数组中的元素数。您需要以某种方式跟踪该数组中的顶点数,然后在glDrawArrays调用中使用该计数器

编辑-更多信息:

GLDrawArray中的最后一个参数是渲染的顶点数。sizeof(顶点)应返回GLdouble*中的字节数(4字节),sizeof(顶点*)应返回GLdouble中的字节数(8字节)。那么从技术上讲,4/8应该四舍五入为零,因为它们是整数,所以我不确定它为什么渲染任何东西


但是,我非常确定(假设顶点正确完成),如果将该数字更改为24,它将起作用。

按照他使用它的方式,它将为他提供数组中的元素数。只是不是顶点的数量,因为元素是单浮点数。修复是正确的。哦,我明白了。它返回的是浮点数,而不是顶点数。因此,由于每个顶点有3个浮点数,它返回的是72而不是24。这意味着我对sizeof的理解有点偏离,
sizeof(指针指向双精度)/sizeof(*指针指向双精度)
如何返回数组元素的数量?没错。我似乎误读了这份文件。我认为最后一个参数是元素数(GLDouble)。谢谢!:-)arasmussen:由于数组是在同一范围内静态定义的,因此编译器可以获得必要的类型/大小信息。在此上下文中,sizeof(array)给出了数组的总大小(以字节为单位)。sizeof(*array)与sizeof(array[0])相同,后者与sizeof(GLdouble)相同。按照他使用它的方式,它将为他提供数组中的元素数。只是不是顶点的数量,因为元素是单浮点数。修复是正确的。哦,我明白了。它返回的是浮点数,而不是顶点数。因此,由于每个顶点有3个浮点数,它返回的是72而不是24。这意味着我对sizeof的理解有点偏离,
sizeof(指针指向双精度)/sizeof(*指针指向双精度)
如何返回数组元素的数量?没错。我似乎误读了这份文件。我认为最后一个参数是元素数(GLDouble)。谢谢!:-)arasmussen:由于数组是在同一范围内静态定义的,因此编译器可以获得必要的类型/大小信息。在此上下文中,sizeof(array)给出了数组的总大小(以字节为单位)。sizeof(*array)与sizeof(array[0])相同,后者与sizeof(GLdouble)相同。