正确初始化OpenGL的struct数组

时间:2014-02-21 08:27:31

标签: c++ arrays opengl struct

我想在两个数组中存储一些 Vertex-Data ,一个用于静态,另一个应该动态即可。

第一个数组将包含 position-data ,它不会改变,但第二个数组将包含纹理坐标(我使用纹理图集) 。它们可能会在运行时发生变化。


想象一下,我有两个结构:

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}错误。


我的问题:

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

1 个答案:

答案 0 :(得分:1)

您的代码看起来有点像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)  
};