C++ 来自指针向量的OpenGL数组缓冲区

C++ 来自指针向量的OpenGL数组缓冲区,c++,pointers,opengl,C++,Pointers,Opengl,问题 我有一个指向粒子的指针向量: 结构粒子{ vec3 pos;//只有3个浮点数,GLM vec3 struct // ... } 向量粒子; 我想使用这个向量作为OpenGL中数组缓冲区的数据源 像这样: glGenBuffers1和particleBuffer; glBindBufferGL_数组_缓冲区,刨花板缓冲区; int bufferSize=sizeofParticle*粒子->大小; glBufferDataGL\u数组\u缓冲区,缓冲区大小,/*这里是什么?*/,,GL_静

问题 我有一个指向粒子的指针向量:

结构粒子{ vec3 pos;//只有3个浮点数,GLM vec3 struct // ... } 向量粒子; 我想使用这个向量作为OpenGL中数组缓冲区的数据源 像这样:

glGenBuffers1和particleBuffer; glBindBufferGL_数组_缓冲区,刨花板缓冲区; int bufferSize=sizeofParticle*粒子->大小; glBufferDataGL\u数组\u缓冲区,缓冲区大小,/*这里是什么?*/,,GL_静态_绘图; GlenableVertexAttributeArrayPositionAttributeLocation; glvertexattributepointerpositionattributelocation,3,GL_FLOAT,GL_FALSE,sizeofParticle,void*0; 有趣的一行是glBufferData

如何让OpenGL获得数据是指针

如何让OpenGL获得数据是指针

你没有

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

此外,访问像这样的间接数据结构效率极低。仅仅为了访问一个值就必须执行两个指针间接寻址,这基本上破坏了内存访问中缓存一致性的所有机会。如果没有这些,每个独立粒子都是缓存未命中

那太糟糕了。这就是为什么OpenGL不允许你这么做。或者至少,它不会让你直接这么做

正确的方法是使用平面向量,并根据需要移动它们

如何让OpenGL获得数据是指针

你没有

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

此外,访问像这样的间接数据结构效率极低。仅仅为了访问一个值就必须执行两个指针间接寻址,这基本上破坏了内存访问中缓存一致性的所有机会。如果没有这些,每个独立粒子都是缓存未命中

那太糟糕了。这就是为什么OpenGL不允许你这么做。或者至少,它不会让你直接这么做

正确的方法是使用平面向量,并根据需要移动它们。

glBufferData需要指向要使用的数据数组的指针。在您的情况下,顶点将使用GLfloat[]。您可以编写一个函数,从粒子向量创建GLfloat[]。我使用的代码创建一个GLfloat[],然后将其作为指针传递给一个构造函数,该构造函数随后设置缓冲区数据。这是我的密码

创建顶点数组-GlFloat[]

创建顶点后,我创建一个缓冲区对象,它只创建一个新的缓冲区并设置它的数据; Buffer*vbo=新的缓冲顶点,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实践,我建议您查看以下ChernoProject发布的youtube播放列表

glBufferData需要一个指向您希望使用的数据数组的指针。在您的情况下,顶点将使用GLfloat[]。您可以编写一个函数,从粒子向量创建GLfloat[]。我使用的代码创建一个GLfloat[],然后将其作为指针传递给一个构造函数,该构造函数随后设置缓冲区数据。这是我的密码

创建顶点数组-GlFloat[]

创建顶点后,我创建一个缓冲区对象,它只创建一个新的缓冲区并设置它的数据; Buffer*vbo=新的缓冲顶点,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实践,我建议您查看以下ChernoProject发布的youtube播放列表

问题:我有一个指向粒子的指针向量::解决方案:停止使用指向粒子的指针向量;但说真的,不要那样做。不仅仅是因为OpenGL不能处理像这样的间接数据结构。我想这可能有用吧?问题:我有一个指向粒子的指针向量::解决方案:停止使用指向粒子的指针向量;但说真的,不要那样做。不仅仅是因为OpenGL不能处理像这样的间接数据结构。我想这可能有用吧?