OpenGL的数组缓冲区从指针

问题描述:

的向量问题 我有指针到颗粒载体: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://*.com/questions/2923272/how-to-convert-vector-to-array-in-c – domsson

如何获得OpenGL以获取数据是指针?

你不知道。

缓冲区对象的重点在于数据位于GPU可访问的内存中。指针是地址,指向CPU可访问对象的指针是指向CPU地址的指针。因此不是指向GPU可访问内存的指针。

此外,访问这样的间接数据结构是令人难以置信的效率低下。为了访问单个值而必须进行两次指针间接寻址,基本上破坏了内存访问中所有缓存一致性的机会。没有这个,每个独立的粒子就是一个缓存未命中。

这很糟糕。这就是为什么OpenGL不会让你这样做。或者至少,它不会让你直接做。

正确的做法是使用平板vector<Particle>,并根据需要移动它们。

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