我的地形有一个动态高度图,几乎每一帧都会被修改,我应该使用gltexsubimage2d和纹理作为高度图,还是每帧更新顶点缓冲区而不是创建vbo?什么方法应该更快?据我所知,我正在失去通过vbo发送数据的硬件双线性过滤器,但根据谷歌gltexxubimage2d导致移动设备出现问题,看起来我不能逐帧使用它,因为它很慢。
实际上问题应该是:是否比使用顶点属性更快地将数据发送到gpu内存?是否依赖于实现?在android中的opengl中是否有任何实体获得纹理更新,例如使用quad作为视频播放画布?我知道这个问题对于像mali-400或tegra3这样的新设备来说可能是胡说八道,其中两种方法对我来说都应该是性能不足的,但我想与adreno200或sgx535兼容。
答案 0 :(得分:0)
我建议去寻找纹理修改与顶点操作。
这是因为VBO操作比将纹理内存修改为内存需要更多的数据移动和内存带宽。
考虑到每个顶点至少有5个项目(x + y + z + tx + ty),但考虑到在任何光照算法中非常典型的法线,都有8个项目。
另一方面,纹理只是每个顶点一个值(通常)。
这个解决方案的一个常见错误导致了很多缓慢,很多新手(我相信这不是你的情况)会为他们的高度图启用mipmap生成纹理。
确保禁用它:
glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_FALSE);
另一个建议是将纹理像素的格式设置为最低要求,8888比444像素分辨率重得多。这意味着每帧的内存传输速度要快得多。
我希望这会有所帮助。