【问题标题】:OpenGL Vertex ArraysOpenGL 顶点数组
【发布时间】:2010-07-18 00:24:44
【问题描述】:

我有一个名为 Point 的结构(恰好是一个 Python 扩展),它看起来像这样:

struct Point {
    PyObject_HEAD    // Macro that expands to include a few more members
    double x;
    double y;
};

我还有另一个结构体,可以在两个数组中保存一堆这样的结构体:

struct Polygon {
    int length;
    Point **vertex_points;
    Point **texcrd_points;
}

我想用这些来映射多边形的顶点和纹理坐标与顶点数组。问题是 Vertex Arrays 需要以下格式的数组:

[x, y, x, y, x, y, etc]

有没有办法可以用Polygon->vertex_pointsPolygon->texcrd_points 调用glVertexPointerglTexCoordPointer,或者我必须构造与gl*Pointer 所期望的匹配的新数组吗?

【问题讨论】:

    标签: c opengl vertex-array


    【解决方案1】:

    您可以使用顶点数组的基数调用glVertexPointer,并使用纹理坐标数组的基数调用glTexCoordPointer。只要这些数组中的事物数量与正确(相同)的顶点数对齐,这应该可以正常工作。

    OpenGL 无法显式访问结构的成员。成员将在内存中并排排列(请参阅下面的警告)。如果多个 Point 结构在内存中是一系列的,那么实际上你有一个大的双精度列表。 OpenGL 不知道结构,它只需要一个大列表(在这种情况下为双)值。但是你可以构建一系列点,然后给 OpenGL 一个指向第一个点的指针,如果内存中的布局没有错误或填充,它们将是等价的。

    如果您对 C 语言太陌生而无法在概念上掌握这一点(连同内存布局注意事项),那么您应该在调用 GL 之前将所有双精度复制到一个新数组中。

    我确实质疑了几件事:也许这里缺少代码,但是使用 Point** 而不是 Point* 看起来很可疑,因为 glVertexPointer 等会在这里期望一个扁平的值数组。出于同样的原因,虽然它可能已经很好地对齐了,但理论上这些结构的数组可能不会在内存中刷新打包在一起。您可以根据您的编译器显式执行此操作,或者您可以使用 GL 调用中的 stride 参数来显式了解每个顶点之间的内存距离。

    【讨论】:

    • 问题是 glVertexPointer 需要一个扁平的数字数组,而不是 Points*。我需要某种方式告诉 glVertexPointer 坐标数据位于 Point->x 和 Point->y 中,而无需构建平面数组。
    • 哦,Polygon 有 Point*s 而不是 Points 是因为 Point 是 Python 扩展类型。使用扩展类型的首选方式是始终操作它们的指针。
    • 我用 C 内存管理信息更新了答案,我认为这是这里的理解差距。仅当您对自己正在做的事情感到满意时才使用“内存多态性”。而且我对 Python 了解不多,所以我假设你知道你在那里做什么。 :)
    • 好吧,我应该把它放在原来的问题中,但是扩展类型在结构中还有其他成员,所以 Point 的坐标成员不会彼此相邻布置。并且成员之间不会有一致的字节偏移量,因此使用 stride 也不起作用。看起来我将不得不构建另一个数组,其中只包含坐标数据。
    【解决方案2】:

    http://www.opengl.org/sdk/docs/man/xhtml/glVertexPointer.xml

    http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml

    这两个函数中的参数 'size' 可能是您所需要的(并且您需要 2 个顶点 - struct Point 和 'type'=GL_DOUBLE)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多