0

我正在开发一个以 OpenGL 作为基础渲染器的渲染引擎。渲染器在开始时以 150 fps 开始,大约 30 秒后 fps 增加到 500。我已经分别为引擎的每个部分计时,唯一提高速度的部分是绑定 [静态]VBO 和调用的 drawMesh 函数glDrawArrays。

我还评论了 glPush 和 glGet 函数,它们的行为与结果相同。

每次我运行引擎时都会发生这种情况,即使相机没有移动并保持渲染完全相同的场景。

有谁知道这是怎么发生的?

4

2 回答 2

1

问题

问题源于 VBO 在创建后被映射到缓冲区。模型类执行一次以更新其边界;并且在粒子的情况下用所需的数据更新缓冲区。

似乎视频卡(或至少在我的情况下具有Geforce GTS 450)在取消映射 VBO 后不会直接将数据复制回视频卡,特别是在使用 GL_READ_WRITE_ARB 标志映射缓冲区时。它会将数据保存在外部 RAM 中几秒钟,然后再将数据复制回 VRAM。

解决方案

通过使用 GL_READ_ONLY_ARB 标志来映射应该只读取数据的数据,缓冲区将几乎直接复制回 VRAM。但是,在我的情况下,在网格对话期间计算边界并且在为此目的创建 VBO 后根本不访问数据会更有效。

于 2013-02-06T16:22:29.873 回答
0

也许是因为着色器是在首次使用之前即时编译的。

看看GL_ARB_get_program_binary

此外,在初始化阶段加载它们时,尝试使用着色器渲染三角形(可能会在屏幕外执行此操作)。

于 2013-02-04T17:09:16.240 回答