Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL顶点缓冲区对象,我可以访问顶点数据用于其他用途,如碰撞检测吗?_Opengl_Collision Detection_Vertex_Vertex Buffer_Vertex Array - Fatal编程技术网

OpenGL顶点缓冲区对象,我可以访问顶点数据用于其他用途,如碰撞检测吗?

OpenGL顶点缓冲区对象,我可以访问顶点数据用于其他用途,如碰撞检测吗?,opengl,collision-detection,vertex,vertex-buffer,vertex-array,Opengl,Collision Detection,Vertex,Vertex Buffer,Vertex Array,我目前正在使用Superbible第五版附带的GLTools类。我正在查找GLTriangleBatch类,它有以下代码: // Create the master vertex array object glGenVertexArrays(1, &vertexArrayBufferObject); glBindVertexArray(vertexArrayBufferObject); // Create the buffer objects glGenBuffers(4, buff

我目前正在使用Superbible第五版附带的GLTools类。我正在查找GLTriangleBatch类,它有以下代码:

// Create the master vertex array object
glGenVertexArrays(1, &vertexArrayBufferObject);
glBindVertexArray(vertexArrayBufferObject);


// Create the buffer objects
glGenBuffers(4, bufferObjects);

#define VERTEX_DATA     0
#define NORMAL_DATA     1
#define TEXTURE_DATA    2
#define INDEX_DATA      3

// Copy data to video memory
// Vertex data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_VERTEX);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pVerts, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0);

// Normal data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_NORMAL);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0);

// Texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_TEXTURE0);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_TEXTURE0, 2, GL_FLOAT, GL_FALSE, 0, 0);

// Indexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*nNumIndexes, pIndexes, GL_STATIC_DRAW);

// Done
glBindVertexArray(0);

// Free older, larger arrays
delete [] pIndexes;
delete [] pVerts;
delete [] pNorms;
delete [] pTexCoords;

// Reasign pointers so they are marked as unused
pIndexes = NULL;
pVerts = NULL;
pNorms = NULL;
pTexCoords = NULL;
据我所知,代码传递指针pVerts、pNorms、pTexCoords、pIndexes的数组,并将它们存储在一个顶点数组对象中,该对象本质上是一个顶点缓冲区对象数组。这些存储在GPU的内存中。然后删除原始指针

我感兴趣的是访问顶点位置,它们位于pVert指向的数组中


现在我的问题是围绕碰撞检测。我希望能够访问GLTriangleBatch所有顶点的数组。我可以在以后使用某种getter方法通过
vertexBufferObject
获取它们吗?是否最好只保留pVerts指针,并使用getter方法来代替?我考虑的是性能,因为我希望将来实现GJK碰撞检测算法…

缓冲区对象,当用作顶点数据源时,是为了渲染而存在的。从性能角度来看,通常不建议向后(读回数据)

您给glBufferData的提示有三种访问模式:绘制、读取和复制;这些将告诉OpenGL您打算如何直接从缓冲区对象获取/检索数据。这些提示并不控制OpenGL应该如何读取/写入它。这些只是暗示;API不强制执行任何特定行为,但违反这些行为可能会导致性能低下

DRAW意味着您将把数据放入缓冲区,但不会从中读取数据。读取意味着您将从缓冲区读取数据,但不会写入数据(通常用于变换反馈或像素缓冲区)。复制意味着您既不会直接读取缓冲区,也不会直接写入缓冲区

请注意,“读写”没有提示。“写”、“读”和“不”都是一个提示,提示如何将数据直接写入缓冲器,然后从该缓冲器开始读取。 同样,提示用于用户直接获取或检索数据
glBufferData
glBufferSubData
和各种映射函数都执行写入操作,而
glGetBufferSubData
和映射函数都执行读取操作

无论如何,不,你不应该这样做。如果需要在客户端上使用位置数据,请在客户端内存中保留位置数据的副本

此外,一些驱动程序完全忽略使用提示。相反,它们根据您实际使用缓冲区对象的方式,而不是您所说的打算使用缓冲区对象的方式来决定将缓冲区对象放置在何处。这对您来说更糟糕,因为如果您开始从该缓冲区读取数据,驱动程序可能会将缓冲区的数据移动到速度不快的内存中。它可能会移出GPU,甚至进入客户机内存空间


但是,如果您坚持这样做,有两种方法可以从缓冲区对象读取数据
glGetBufferSubData
glBufferSubData
相反。而且,您可以始终映射缓冲区以进行读取而不是写入。

谢谢!这个回答非常有帮助!我将保留pVert指针,以便稍后访问顶点数据。@user785259:仅保留指针是不够的。实际上,您必须保留已分配的内存,即不要
delete[]
free(…)
它。即使在释放内存后,指针仍可能在C中,这是无效的。也许您来自一种垃圾收集语言,那么丢弃指针实际上意味着释放内存,是的,这是明智的语义。但这是C++你正在处理,所有这些挑剔是不可避免的必要。