我正在尝试可视化非常大的点云(700百万个点),但在glDrawArrays
调用时,调试器会抛出访问冲突写入位置异常。我使用相同的代码来渲染较小的点云(100百万个点),一切都正常工作。我也有足够的RAM内存(32GB)来存储数据。
为了存储点云,我正在使用std :: vector<Point3D<float>>
,其中Point3D是
template <class T>
union Point3D
{
T data[3];
struct{
T x;
T y;
T z;
};
}
顶点数组和缓冲区初始化:
glBindVertexArray(pxCloudHeader.uiVBA);
glBindBuffer(GL_ARRAY_BUFFER, pxCloudHeader.xVBOs.uiVBO_XYZ);
glBufferData(GL_ARRAY_BUFFER, pxCloudHeader.iPointsCount * sizeof(GLfloat) * 3, &p3DfXYZ->data[0], GL_STREAM_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
绘制调用:
glBindVertexArray(pxCloudHeader.uiVBA);
glDrawArrays(GL_POINTS, 0, pxCloudHeader.iPointsCount); // here exception is thrown
glBindVertexArray(0);
我也检查了是否有OpenGL错误,但我没有发现任何问题。
sizeof(GLsizeiptr)
实际上为8? 7亿 * 4 * 3 > 32位指针可以引用。当您分配缓冲区时,可能会溢出大小参数。GLsizeiptr
的大小将决定您可以分配的最大连续内存块;没有其他API限制可以查询这种情况......但是,使用3个非连续数组而不是1个交错数组可能有助于绕过这种限制。 - Andon M. Coleman