2016-07-27 60 views
1

我创建了一个着色器存储缓冲区对象,为我的顶点着色器提供信息。它绑定到包含单个结构的缓冲区。但有一个问题。我保留在这个结构中的数据不是一个简单的数组,它是一个std::vector给OpenGL的C++容器?

下面是结构:

typedef struct { 
    glm::mat4 modelMatrix; 
} entityInfo; 

typedef struct { 
    std::vector<entityInfo> entityInfoBuffer; 
} shaderData; 

MAT4只是一个简单的4×4矩阵浮动。

如果我把这个给OpenGL,传输给GPU的数据将只是一堆关于矩阵/向量的指针和信息,而不是它们中的数据。

一个解决办法是只对OpenGL创建一个结构:

typedef struct { 
    float* modelMatrix; 
} SSBOentityInfo; 

typedef struct { 
    SSBOentityInfo* entityInfoBuffer; 
} SSBOshaderData; 

但我将不得不复制对应容器的数据指针eeeeevery。

有没有更好的方法来做到这一点?

+0

难道你不想只发送'entityInfoBuffer'的内容到GPU?您不希望将CPU指针复制到GPU,它们对GPU没有任何意义(您可能会复制随机数字)。 – immibis

+0

我认为,在使用着色器存储缓冲区对象时,必须使用结构?我错了 ?这将意味着我将不得不将'entityInfoBuffer.data()'设置为SSBOshaderData' entityInfoBuffer'?此外,OpenGL将只能读取'&mat4 [0] [0]'。 – Talesseed

+0

@Talesseed:“*你必须使用结构?*”为什么?数据是数据,内存是内存,缓冲对象是缓冲对象。 –

回答

4

glm::mat4对于所有意图和目的,是一组16 float s。不是指针到16浮点数,实际​​数组。一个接一个。

因此,​​3210管理一个连续的元素数组,其中每个元素是16个浮点数。这是你想要存储在缓冲区对象中的数据。所以......那样做。

vector管理连续的数据数组,因此获得指向该数组的指针是完全合法的。这就是vector.data()的用途。所以这就是你给glBufferSubData或其他什么的源头指针。大小将是数组中元素的数量(vector.size())乘以sizeof计算的每个元素的大小。

+0

谢谢,我虽然说mat4不是一个数组。但是,如果我想使用结构体以便稍后添加元素,我该怎么办? – Talesseed

+0

@Talesseed:目前还不清楚你的意思,但我敢肯定,这与你在这里问的问题不同。 –

+0

我想添加更多的成员shaderData。但是,是的,我认为这是另一个问题。 – Talesseed