当前位置:  开发笔记 > 后端 > 正文

glDrawArrays不会渲染整个点云

如何解决《glDrawArrays不会渲染整个点云》经验,为你挑选了1个好方法。

我正在尝试渲染巨大的点云(~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.9M50.4M取决于您的兆字节是二进制还是十进制.我首先检查你的OpenGL绑定库,看看它声明的原型正确使用64位类型.如果确实如此,那么bug必须在OpenGL驱动程序中.

要将超过4GB的数据传输到缓冲区,您可以尝试使用其他可用功能之一:glBufferSubDataglBufferStorage/或缓冲区内存映射glMapBufferRange,这可能会解决4GB的限制.

另一件需要考虑的事情是使用一个VAO但在多个缓冲区之间拆分数据.据推测,你Point的不同属性包括位置,颜色等......你可以把它们放在一个单独的缓冲区里,然后仍然使用一个VAO和一个绘图调用.您还可以优化所使用属性的类型(例如,不要使用短路或字节可以使用的浮点数)和结构的布局(检查字段之间没有不必要的填充).



1> ybungalobill..:

看起来系统的某些部分使用32位无符号整数来存储缓冲区的大小,从而传递148M*44bytes溢出并转换为大约54.9M50.4M取决于您的兆字节是二进制还是十进制.我首先检查你的OpenGL绑定库,看看它声明的原型正确使用64位类型.如果确实如此,那么bug必须在OpenGL驱动程序中.

要将超过4GB的数据传输到缓冲区,您可以尝试使用其他可用功能之一:glBufferSubDataglBufferStorage/或缓冲区内存映射glMapBufferRange,这可能会解决4GB的限制.

另一件需要考虑的事情是使用一个VAO但在多个缓冲区之间拆分数据.据推测,你Point的不同属性包括位置,颜色等......你可以把它们放在一个单独的缓冲区里,然后仍然使用一个VAO和一个绘图调用.您还可以优化所使用属性的类型(例如,不要使用短路或字节可以使用的浮点数)和结构的布局(检查字段之间没有不必要的填充).

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有