需求描述:
    我想动态更新纹理,以显示不同的图片。我做法是:在Init函数中:
glGenTextures(1,&ui32TexID);
MyLoadTexture(tFile);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_TEXTURE_W,GL_TEXTURE_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData2);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
delete[] pTexData2;在Render函数中:
glBindTexture(GL_TEXTURE_2D, ui32TexID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_TEXTURE_W,GL_TEXTURE_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData2);
delete[] pTexData2;但是这样内存会慢慢涨上去,如果把Render函数中的glTexImage2D注释掉。内存就不会增长。请问应该怎么实现纹理动态更新呢?

解决方案 »

  1.   

    内存涨不涨先不说,即使内存涨了,你现在也没有实现动态纹理,为什么,因为你读取图像数据的工作只在初始化函数做了一次,之后数据不再变化,怎么会有动态纹理呢?要实现动态纹理,你必须把加载不同图像数据的工作也放在绘制函数里,具体的实现方式是这样的,你可以定义一个静态或成员布尔变量,用来在绘制函数里判断纹理始化工作是否做了,如果没做,就初始化,并把这个布尔变为真,否则,如果初始化了,那就绑定这个纹理,用glTexSubImage2D来实现纹理替换,同时,你读取图像文件的工作也要放在绘制函数里,并且放在这个初始化判断之前,要保证,只要调用了绘制函数,你就在读不同的图像更换数据,更换了数据并用glTexSubImage2D做了替换,动态纹理就实现了
      

  2.   

    谢谢你的回复。
    不好意思忘记写句话了。在Init函数中:
    glGenTextures(1,&ui32TexID);
    MyLoadTexture(tFile);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_TEXTURE_W,GL_TEXTURE_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData2);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    delete[] pTexData2;在Render函数中:
    MyLoadTexture(tNewFile);
    glBindTexture(GL_TEXTURE_2D, ui32TexID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_TEXTURE_W,GL_TEXTURE_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, pTexData2);
    delete[] pTexData2;
      

  3.   

    把glTexImage2D改成glTexSubImage2D,调整下具体的参数,看看
      

  4.   

    android openglES 中用glTexSubImage2D的效率很低,请问如何解决?