2017-03-02 154 views
0

的向量問題 我有指針到顆粒載體:OpenGL的數組緩衝區從指針

struct Particle { 
    vec3 pos; // just 3 floats, GLM vec3 struct 
    // ... 
} 
std::vector<Particle *> particles; 

我想用這個矢量作爲數據的用於在OpenGL 像陣列緩衝器中的源這樣的:

glGenBuffers(1, &particleBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, particleBuffer); 
int bufferSize = sizeof(Particle) * particles->size(); 
glBufferData(GL_ARRAY_BUFFER, bufferSize, /* What goes here? */, GL_STATIC_DRAW); 

glEnableVertexAttribArray(positionAttribLocation); 
glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), (void *)0); 

凡有趣的線glBufferData(...)

^h我是否得到OpenGL來獲取數據是指針?

+2

「***問題:**我有一個指向粒子的向量向量:*」:解決方案:停止使用指向粒子的向量向量;但嚴重的是,不要這樣做。而不僅僅是因爲OpenGL不適用於這樣的間接數據結構。 –

+0

我想這可能有用嗎? http://stackoverflow.com/questions/2923272/how-to-convert-vector-to-array-in-c – domsson

回答

4

如何獲得OpenGL以獲取數據是指針?

你不知道。

緩衝區對象的重點在於數據位於GPU可訪問的內存中。指針是地址,指向CPU可訪問對象的指針是指向CPU地址的指針。因此不是指向GPU可訪問內存的指針。

此外,訪問這樣的間接數據結構是令人難以置信的效率低下。爲了訪問單個值而必須進行兩次指針間接尋址,基本上破壞了內存訪問中所有緩存一致性的機會。沒有這個,每個獨立的粒子就是一個緩存未命中。

這很糟糕。這就是爲什麼OpenGL不會讓你這樣做。或者至少,它不會讓你直接做。

正確的做法是使用平板vector<Particle>,並根據需要移動它們。

0

glBufferData需要一個指向您希望使用的數據的數組的指針。在你的情況下,GLfloat[]將用於頂點。您可以編寫一個函數,從粒子矢量創建一個GLfloat[]。我使用的代碼創建GLfloat[],然後將其作爲指針傳遞給構造函數,然後設置緩衝區數據。這是我的代碼;

創建頂點數組 -GlFloat[]

GLfloat vertices[] = { 0, 0, 0, 
         0, 3, 0, 
         8, 3, 0, 
         8, 0, 0 }; 

我創建的頂點後,我再創建一個緩衝對象(這只是創建了一個新的緩衝區,並設置它的數據);
Buffer* vbo = new Buffer(vertices, 4 * 3, 3);

我的緩衝區對象的構造函數是;

Buffer::Buffer(GLfloat* data, GLsizei count, GLuint componentCount) { 
    m_componentCount = componentCount; 

    glGenBuffers(1, &m_bufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, m_bufferID); 
    glBufferData(GL_ARRAY_BUFFER, count * sizeof(GLfloat), data, GL_STATIC_DRAW); //Set the buffer data to the GLFloat pointer which points to the array of vertices created earlier. 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

在此之後陣列已經傳遞到緩衝區,可以刪除的對象,以節省內存但是它建議持有到它的情況下,它以後再使用。

欲瞭解更多信息,以及更好的OpenGL做法,我建議你看看下面的youtube播放列表TheChernoProject
https://www.youtube.com/watch?v=qTGMXcFLk2E&list=PLlrATfBNZ98fqE45g3jZA_hLGUrD4bo6_&index=12