gpt4 book ai didi

opengl - glDrawArrays 不渲染整个点云

转载 作者:行者123 更新时间:2023-12-05 09:19:09 25 4
gpt4 key购买 nike

我正在尝试渲染巨大的点云 (~150M),但 OpenGL 只渲染其中的一部分 (~52M)。渲染较小的数据集(<40M)时一切正常。我正在使用单个 VBO。使用多个 VBO 时,会渲染点,但渲染速度非常慢,这是预期的。我的元素大小为 44 字节,GPU 有 3GB 可用内存。这对于近 7000 万个点应该足够了,但我可以使用多个 VBO 渲染多达 10000 万个点。 每个 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());

最佳答案

看起来您的系统的某些部分使用 32 位无符号整数来存储缓冲区的大小,因此 148M*44bytes 溢出并转换为大约 54.9M50.4M 取决于您的兆字节是二进制还是十进制。我将从检查您的 OpenGL 绑定(bind)库开始,看看它声明的原型(prototype)是否正确使用 64 位类型。如果是,则该错误一定在 OpenGL 驱动程序中。

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

要考虑的另一件事是使用一个 VAO 但将数据拆分到多个缓冲区。大概您的 Point 由不同的属性组成,例如位置、颜色等...您可以将它们中的每一个都放在一个单独的缓冲区中,并且仍然使用一个 VAO 和一个绘制调用。您还可以优化您使用的属性类型(例如,不要在可以使用短裤或字节的地方使用 float )和结构布局(检查字段之间是否没有不必要的填充)。

关于opengl - glDrawArrays 不渲染整个点云,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41878799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com