我有一个CUDA代码,可以在某些点上构建网格。算法的输出是一个点阵列,其中每3个连续点形成一个三角形。这是前9个点的示例(每个组件是一个4字节的浮点数):
XYZRGB XYZRGB XYZRGB XYZRGB XYZRGB XYZRGB XYZRGB XYZRGB XYZRGB ...
<---1st triangle---> <---2nd triangle---> <---3rd triangle---> ...
现在我想使用OpenGL绘制这些三角形。我目前的方法如下:我将点输出列表下载到CPU内存,将其传递给OpenGL并绘制它们。这里显而易见的问题是将数据从GPU复制到主存储器并返回到GPU。在一个方向上复制数据最多需要10毫秒。所以我想优化我的代码并消除内存传输。有没有办法告诉OpenGL使用我的GPU内存?
我的代码中的主循环如下所示:
std::vector<Point6f> mesh(config.MaxMeshIndex);
for (;;)
{
//build mesh
builder->Build(devPoints.ptr(), devPoints.size());
//download to the main memory
auto meshSize = builder->GetMesh(mesh);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// tell OpenGL to use points from the main memory
glBufferSubData(GL_ARRAY_BUFFER, 0, meshSize * sizeof(Point6f), mesh.data());
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawArrays(GL_TRIANGLES, 0, meshSize);
glBindVertexArray(0);
}
我知道OpenGL抽象很多,所以也许没有API调用。扩展怎么样?或者可能放弃使用OpenGL来支持另一个库?
这是一个自定义代码,因此我不需要与所有现有的视频卡兼容。我需要它专门用于NVIDIA显卡,1080 GTX。