在OpenGL 3.3中,AMD GPU可以绘制最大数量的顶点吗?

时间:2014-02-02 10:16:36

标签: c++ opengl gpu point-cloud-library point-clouds

我写了一个小应用程序来显示通常大小~20m点的大点顶点,包括位置值xyz和颜色值RGB。

我在使用Nvidia GTX 670 GPU的工作站上没有遇到任何问题,但现在已经改为使用AMD HD6950的另一个工作站,现在没有显示大型的点云。

我原本以为AMD GPU可以在一次调用中绘制的顶点数量有限,但经过额外测试后认为情况并非如此。

我生成了一个测试pointcloud(用简单的'for'循环完成)比其他点云更大,格式相同[vc3(xyz)& vec3(rgb)],这个云仍然显示,但不是激光扫描仪的其他大点云。 看看CodeXL中的VBO状态,它们都存在并且大小正确(对于20m vec3来说是233MB)所以除非非调试pointcloud从某个地方获取不正确的值,否则我无法看到错误的位置。

值得注意的是,我已经使用了小型点云(30k顶点),它们在AMD计算机上加载得很好但不是很大。

作为完整性检查,这是用于生成调试pointcloud的代码:

// Holders for position and colour
std::vector<glm::vec3> t_position;
std::vector<glm::vec3> t_colour;

// Reserve memory
t_position.reserve(point_cloud_size);
t_colour.reserve(point_cloud_size);

// Generate Data
for (int x=0; x < cube_root; x++) {
    for (int y=0; y < cube_root; y++) {
        for (int z=0; z < cube_root; z++) {
            t_position.push_back(glm::vec3(x/10.0 - 0.5, y/10.0 -0.5, z/10.0 -0.5));
            t_colour.push_back(glm::vec3((float)x/10.0,(float)y/10.0,(float)z/10.0));
        }
    }
}

这是生成激光扫描点云的方法:

pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointcloud (new pcl::PointCloud<pcl::PointXYZRGBNormal>);

if (pcl::io::loadPCDFile(point_cloud_path, *pointcloud) == -1) // Loading pointcloud from file path.
{
// Error Catch
    PCL_ERROR("Could not load pointcloud\n");
}

// Number of points in cloud
point_cloud_size = pointcloud->size();

// Sanity Check
std::cout << "Loaded Pointcloud of size: " << point_cloud_size << std::endl;

// Create data vectors
std::vector<glm::vec3> t_position;
std::vector<glm::vec3> t_colour;

// Reserve space in vectors for data
t_position.reserve(point_cloud_size);
t_colour.reserve(point_cloud_size);

// pointer for pcl data
pcl::PointXYZRGBNormal point_ptr;

std::cout << "Converting Pointcloud into vectors" << std::endl;
// Convert pointcloud to individual components (NEEDS OPTIMIZING)
for (int i = 0; i<point_cloud_size; i++) {

// Loading Bar for point cloud conversion
    loadbar(i, point_cloud_size);

    point_ptr = pointcloud->at(i);

    t_position.push_back(glm::vec3(point_ptr.x, point_ptr.y, point_ptr.z));
    t_colour.push_back(glm::vec3(point_ptr.r/255.0, point_ptr.g/255.0, point_ptr.b/255.0));
}

使用相同的方法将两个pointcloud加载到VBO和VAO:

BindPointCloud(t_position,t_colour);

所以我看不出绑定是个问题。

所以我很遗憾问题是什么,因为它在配备NVidia GPU但不是AMD的工作站上工作正常。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

除了AMD自己的工具之外,gDEBugger也是一个很好的工具,(http://www.gremedy.com/

答案 1 :(得分:0)

问题出在pointclouds坐标上。

有一个奇怪的转换被应用于pointclouds,因此它们没有被渲染。