OpenGL:从GPU内存中绘制三角形

时间:2017-04-19 21:23:59

标签: c++ opengl cuda

我有一个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。

0 个答案:

没有答案