正确初始化 OpenGL 的结构数组



我想在两个数组中存储一些顶点数据,一个用于静态使用,另一个应该是动态的。

第一个数组将包含

位置数据,这不会改变,但第二个数组将包含纹理坐标(我使用纹理图集)。它们可能会在运行时更改。


想象一下我有两个结构:

typedef struct _vertexStatic
{
    GLfloat position[2];
} vertexStatic;
typedef struct _vertexDynamic
{
    GLfloat texCoords[2];
} vertexDynamic;

我声明了我的两个数组,我想初始化它们进行测试。

//Static (position)
//Four vertices that form one quad in the end
const vertexStatic m_StaticVertexData[4] =
{
    {-0.5f,  0.5f}, 
    {0.5f,  0.5f},  
    {0.5f, -0.5f},  
    {-0.5f, -0.5f}  
};
//Dynamic (texture coordinates)
vertexDynamic m_DynamicVertexData[4] =
{
    {0.2f, 0.0f},
    {0.3f, 0.0f},
    {0.3f, 0.1f},
    {0.2f, 0.1f}
};
const GLubyte m_indices[6] =
{
    ?, ?, ?,
    ?, ?, ?
};

此初始化不正确。我在编译时遇到一些array must be initialized with a brace-enclosed initializertoo many initializers for 'const vertexStatic {aka const _vertexStatic}错误。


我的问题:

如何正确初始化顶点数据以及如何查找大量元素?

你的代码看起来有点像 C 代码,但由于你用 c++ 标记了它,我猜你使用的是 c++ 编译器。如果是这样,您应该注意结构与类没有什么不同,只是默认情况下它的所有成员都变为公共成员。

也就是说,更明显的是,你不能用初始值设定项列表初始化一个stuct - 实际上是一个类 - (这就是你实际上使用{ ... }代码),除非你创建了一个适当的构造函数,它采用初始值设定项列表。

因此,您创建了一个initializer_list构造函数来使其工作。但是,这有点容易出错,因为您可以使用任意数量的双精度来初始化它:

struct vertexStatic {
    GLfloat position[2];
    vertexStatic(std::initializer_list<double> l) { 
        int i = 0;
        for(double d : l) {
            position[i] = d;
            i++;
            if(i>1) break;  // this is a bit hacky, maybe you should 
                            // raise an exception if there are more than
                            // two doubles in the init list
        } 
    }
};

另一种方法是仅使用typedef,但是隐藏了您正在处理数组类型:

typedef GLfloat vertexStatic[2];

第三种 - 我认为最好是向结构引入一个普通的构造函数并在初始化中调用它们:

struct vertexStatic {
    GLfloat position[2];
    vertexStatic(GLfloat a, GLfloat b) {
        position[0] = a;
        position[1] = b;
    }
}
// ...
const vertexStatic m_StaticVertexData[4] =
{
    vertexStatic(-0.5f,  0.5f), 
    vertexStatic(0.5f,  0.5f),  
    vertexStatic(0.5f, -0.5f),  
    vertexStatic(-0.5f, -0.5f)  
};

最新更新