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

1 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,
    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,
};
Run Code Online (Sandbox Code Playgroud)

立即绘图:

 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();
Run Code Online (Sandbox Code Playgroud)

使用顶点数组绘图:

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, sizeof(vertices)/sizeof(*vertices));
Run Code Online (Sandbox Code Playgroud)

图片:

在立即模式下绘制正确的立方体

用顶点数组绘制的毛病立方体

我究竟做错了什么?

And*_*sen 5

尝试将您的平局更改为

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, 24);
Run Code Online (Sandbox Code Playgroud)

sizeof()不像你想象的那样工作.它不返回数组中的元素数.您需要以某种方式跟踪该数组中的顶点数,然后在glDrawArrays调用中使用该计数器.

编辑 - 更多信息:

glDrawArrays中的最后一个参数是您要渲染的顶点数.sizeof(vertices)应该返回GLdouble*(4个字节)中的字节数,而sizeof(vertices*)应该返回GLdouble中的字节数(8个字节).那么4/8在技术上应该舍入到零,因为它们是整数,所以我不确定它为什么渲染任何东西.

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

  • arasmussen:由于数组是在同一范围内静态定义的,因此编译器可以获得必要的类型/大小信息.在此上下文中,sizeof(array)以字节为单位给出数组的总大小.sizeof(*array)与sizeof(array [0])相同,与sizeof(GLdouble)相同. (3认同)