C++ 在OpenGL 3.3中,AMD GPU可以绘制的顶点的最大数量是多少?

C++ 在OpenGL 3.3中,AMD GPU可以绘制的顶点的最大数量是多少?,c++,opengl,point-cloud-library,glm-math,point-clouds,C++,Opengl,Point Cloud Library,Glm Math,Point Clouds,我已经编写了一个小应用程序来显示通常大小为~20m的点的大型点云,这些点由位置值xyz和颜色值RGB组成 我在使用Nvidia GTX 670 GPU的工作站上没有遇到任何问题,但现在已改为使用AMD HD6950的另一个工作站,并且现在没有显示大型点云 我最初认为AMD GPU在一次调用中可以绘制的顶点数量可能有限制,但经过额外测试后,我认为情况并非如此 我生成了一个测试点云(使用简单的“for”循环完成),该点云比其他点云更大,并且具有相同的格式[vc3(xyz)和vec3(rgb)],该点

我已经编写了一个小应用程序来显示通常大小为~20m的点的大型点云,这些点由位置值xyz和颜色值RGB组成

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

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

我生成了一个测试点云(使用简单的“for”循环完成),该点云比其他点云更大,并且具有相同的格式[vc3(xyz)和vec3(rgb)],该点云仍然显示,但不显示激光扫描仪中的其他大点云。 查看CodeXL中的VBO状态,这些状态都存在并且大小正确(对于20m vec3,233MB),因此我无法看到错误可能在哪里,除非非调试点云从某处获取不正确的值

还值得注意的是,我使用了小的点云(30k个顶点),它们可以很好地加载,但在AMD计算机上不会加载大的点云

作为健全性检查,以下是生成调试点云的代码:

// 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));
}
所以我看不出绑定是个问题

因此,我很迷茫的问题可能是什么,因为它的工作在一个工作站与NVidia的GPU,但不是AMD的


有什么建议吗?

除了AMD自己的工具外,这是一个很好的工具。

问题在于点云坐标


对点云应用了一个奇怪的变换,因此它们没有被渲染。

像素填充率约为20-30 Gp/s,三角形填充率约为2 Gt/s。当您按可用视频内存已缩放的相同因子缩放顶点数时,会发生什么情况?因此,使用“浮动”中的X、Y、Z数据缩放10 m点将是120GB,因此我怀疑这本身是否会导致内存不足的情况。但是,如果你有,比如说>100万个数据项,我可以从顶点看出这将是一个“内存不足”的问题。但是,图形内存需要的不仅仅是顶点数据,因此根据模型使用的纹理和其他数据,2GB图形内存可能不足以同时保存所有数据。您是否仔细检查了错误情况,如果是,您会收到什么错误消息?我应该补充一下,根据我在不同地方使用图形处理器/图形代码的经验,不太可能有固定的限制。很可能您的代码只是在做一些“硬件无法处理”的事情,而不是在调用中“不能使用超过X个顶点”。1000万个点使用32位浮点=114.44 MiB(而不是120 GB)存储。也就是说,由于AMD从字面上发明了OpenGL调试输出,您可以考虑使用<代码> ARB*Debug Guest.<代码>。AMD非常冗长,如果你做了一些根本错误的事情,可能会有一个警告来解释,但错误不足以产生API错误。感谢我使用AMD的CodeXL来尝试更好地理解着色器中发生的事情。
BindPointCloud(t_position,t_colour);