我正在尝试渲染巨大的点云(~150M),但OpenGL只渲染它的一部分(~52M).渲染较小的数据集(<40M)时一切正常.我正在使用单个VBO.当使用多个VBO时,会渲染点,但渲染速度非常慢,这是预期的.我的元素大小为44bytes,GPU有3GB内存可用.这应该足够接近~70M点,但我可以使用多个VBO渲染多达100M点.每个VBO是否有任何OpenGL特定限制我不知道?.
glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, cloud.size() * sizeof(Point), cloud.data(), GL_STATIC_DRAW); // lot of other code glDrawArrays(GL_POINTS, 0, cloud.size());
ybungalobill.. 6
看起来系统的某些部分使用32位无符号整数来存储缓冲区的大小,从而传递148M*44bytes
溢出并转换为大约54.9M
或50.4M
取决于您的兆字节是二进制还是十进制.我首先检查你的OpenGL绑定库,看看它声明的原型正确使用64位类型.如果确实如此,那么bug必须在OpenGL驱动程序中.
要将超过4GB的数据传输到缓冲区,您可以尝试使用其他可用功能之一:glBufferSubData
和glBufferStorage
/或缓冲区内存映射glMapBufferRange
,这可能会解决4GB的限制.
另一件需要考虑的事情是使用一个VAO但在多个缓冲区之间拆分数据.据推测,你Point
的不同属性包括位置,颜色等......你可以把它们放在一个单独的缓冲区里,然后仍然使用一个VAO和一个绘图调用.您还可以优化所使用属性的类型(例如,不要使用短路或字节可以使用的浮点数)和结构的布局(检查字段之间没有不必要的填充).
看起来系统的某些部分使用32位无符号整数来存储缓冲区的大小,从而传递148M*44bytes
溢出并转换为大约54.9M
或50.4M
取决于您的兆字节是二进制还是十进制.我首先检查你的OpenGL绑定库,看看它声明的原型正确使用64位类型.如果确实如此,那么bug必须在OpenGL驱动程序中.
要将超过4GB的数据传输到缓冲区,您可以尝试使用其他可用功能之一:glBufferSubData
和glBufferStorage
/或缓冲区内存映射glMapBufferRange
,这可能会解决4GB的限制.
另一件需要考虑的事情是使用一个VAO但在多个缓冲区之间拆分数据.据推测,你Point
的不同属性包括位置,颜色等......你可以把它们放在一个单独的缓冲区里,然后仍然使用一个VAO和一个绘图调用.您还可以优化所使用属性的类型(例如,不要使用短路或字节可以使用的浮点数)和结构的布局(检查字段之间没有不必要的填充).