我有一个动态的地形高度图,它几乎每帧都会被修改,我应该使用gltexsubimage2d和纹理作为高度图还是每帧更新顶点缓冲区,而不是创建vbo?哪种方法应该更快?我知道我正在失去通过vbo发送数据的硬件双线性滤波器,但根据谷歌gltexxubimage2d在移动设备上造成问题,它看起来不像我可以逐帧使用它,因为它的速度很慢。
实际上问题应该是:在纹理中发送数据到gpu内存比使用顶点属性更快吗?它依赖于实现吗?有没有人在android的opengl中实现了纹理更新,例如使用quad作为视频播放画布?我知道这个问题在像mali 400或tegra3这样的新设备上可能是无稽之谈,这两种方法对我来说都应该是性能上的问题,但我希望能与adreno200或sgx535兼容。
发布于 2012-06-11 20:49:39
我建议使用纹理修改而不是顶点操作。
这是因为与将纹理内存修改为内存相比,VBO操作需要更多的数据移动和内存带宽。
考虑到每个顶点至少有5个项目(x+y+z+tx+ty),但通常有8个项目,考虑法线,这在任何光照算法中都是非常典型的。
另一方面,纹理仅为每个顶点一个值(通常情况下)。
这个解决方案的一个非常常见的错误是,许多菜鸟(我确信这不是你的情况)为他们用于高度贴图的纹理启用mipmap生成。
确保将其禁用:
glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_FALSE );
另一个建议是将纹理的像素格式降低到最低要求,拥有8888的分辨率比拥有444像素的分辨率要重得多。这意味着每一帧的内存传输速度要快得多。
我希望这能在某种程度上有所帮助。
https://stackoverflow.com/questions/10973828
复制相似问题