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来获取数据是指针?
如何获得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
“***问题:**我有一个指向粒子的向量向量:*”:解决方案:停止使用指向粒子的向量向量;但严重的是,不要这样做。而不仅仅是因为OpenGL不适用于这样的间接数据结构。 –
我想这可能有用吗? http://*.com/questions/2923272/how-to-convert-vector-to-array-in-c – domsson