【问题标题】:OpenGL: Using vertex array to draw a cube causes graphical glitchOpenGL:使用顶点数组绘制立方体会导致图形故障
【发布时间】:2011-04-16 16:07:46
【问题描述】:

当尝试使用顶点数组(而不是使用立即模式渲染)在 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

我做错了什么?

【问题讨论】:

    标签: opengl vertex-array


    【解决方案1】:

    尝试将您的平局更改为

    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,它将起作用。

    【讨论】:

    • 他们使用它的方式,它会给他数组中元素的数量。只是不是顶点的数量,因为元素是单个浮点数。修复是正确的。
    • 哦,我明白了。所以它返回浮点数,而不是顶点数。因此,由于每个顶点有 3 个浮点数,因此它返回 72 而不是 24。
    • 也就是说我对sizeof的理解有点偏差,sizeof(pointer-to-double)/sizeof(*pointer-to-double)是怎么返回数组元素个数的?
    • 没错。我似乎误读了 glDrawArrays 的文档。我坚持最后一个参数是元素的数量(GLdoubles)。谢谢! :-)
    • arasmussen:由于数组是在同一范围内静态定义的,因此编译器可以获得必要的类型/大小信息。在这种情况下, sizeof(array) 以字节为单位给出数组的总大小。 sizeof(*array) 与 sizeof(array[0]) 相同,与 sizeof(GLdouble) 相同。
    猜你喜欢
    • 2015-03-28
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多