这是示例代码:
//img1 2048x2048
//img2 1024x1024
glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img1.getWidth(), img1.getHeight(), 0, GL_BGR, GL_UNSIGNED_BYTE, img1.accessPixels());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
//in other function
glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img2.getWidth(), img2.getHeight(), 0, GL_BGR, GL_UNSIGNED_BYTE, img2.accessPixels());
glBindTexture(GL_TEXTURE_2D, 0);
如您所见,我使用相同的纹理ID来上传两个不同的图像。我使用nvidia-smi监视gpu内存使用情况。纹理使用的内存等于20 MiB。首先上传哪个图像都没有关系。如果我在第一个glTexImage2D之后调用第二个glTexImage2D而没有重新绑定纹理,则内存使用量等于4 MiB:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img1.getWidth(), img1.getHeight(), 0, GL_BGR, GL_UNSIGNED_BYTE, img1.accessPixels());
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img2.getWidth(), img2.getHeight(), 0, GL_BGR, GL_UNSIGNED_BYTE, img2.accessPixels());
重新绑定纹理后,使用相同的纹理ID上传其他图像时,opengl不会释放内存吗?
纹理名称(= ID)只是抽象句柄。在同步点之间,单个纹理名称实际上可以指代任意数量的图像。
考虑以下操作顺序:
glBindTexture(GL_TEXTURE_2D, the_texture);
glTexImage2D(…);
glDraw…();
glTexImage2D(…);
glDraw…();
glTexImage2D(…);
glDraw…();
由于AS-如果规则,每个glDraw…
操作必须与已上载最近的纹理数据得出。但是,由于OpenGL的异步特性,实际绘图操作可能会延迟到(很晚)以后。因此,与此同时,OpenGL实现必须保留各种纹理图像,直到绘制完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句