我写了一个小应用程序来显示通常大小~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的工作站上工作正常。
有什么建议吗?
答案 0 :(得分:1)
除了AMD自己的工具之外,gDEBugger也是一个很好的工具,(http://www.gremedy.com/)
答案 1 :(得分:0)
问题出在pointclouds坐标上。
有一个奇怪的转换被应用于pointclouds,因此它们没有被渲染。