0

我的地形有一个动态高度图,几乎每一帧都会修改,我应该使用 gltexsubimage2d 和纹理作为高度图还是每帧更新顶点缓冲区而不是创建 vbo?什么方法应该更快?我知道我正在丢失通过 vbo 发送数据的硬件双线性滤波器,但根据谷歌 gltexxubimage2d 会导致移动设备出现问题,而且看起来我不能逐帧使用它,因为它很慢。

实际上问题应该是:在纹理中将数据发送到 gpu 内存是否比使用顶点属性更快?它是否依赖于实现?是否有任何身体在 android 的 opengl 中实现了纹理更新,例如使用 quad 作为视频播放画布?我知道这个问题在像 mali-400 或 tegra3 这样的新设备上可能是无稽之谈,这两种方法对我来说性能应该足够了,但我希望与 adreno200 或 sgx535 兼容。

4

1 回答 1

0

我建议进行纹理修改与顶点操作。

这是因为与将纹理内存修改为内存相比,VBO 操作需要更多的数据移动和内存带宽。

考虑到每个顶点至少有 5 个项目(x+y+z+tx+ty),但考虑到在任何照明算法中非常典型的法线,通常有 8 个项目。

另一方面,纹理只是每个顶点的一个值(通常)。

这个解决方案的一个非常常见的错误会导致很多缓慢,是许多新手(我相信这不是你的情况)为他们用于高度图的纹理启用了 mipmap 生成。

确保禁用它:

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);

另一个建议是将纹理像素的格式降至最低要求,8888 比 444 像素分辨率重得多。这意味着每帧的内存传输速度要快得多。

我希望这在某种程度上有所帮助。

于 2012-06-11T12:49:38.547 回答