例如,如果我创建一个像素数组,如下所示:
int *getPixels()
{
int *pixels = new int[10];
pixels[0] = 1;
pixels[1] = 0;
pixels[1] = 1;
// etc...
}
glTexImage2D(..., getPixels());
glTexImage2D是否使用该引用或将像素复制到自己的内存中?
如果答案是前者,那么我应该做以下几点吗?
int *p = getPixels();
glTexImage2D(..., p);
/* Just changed to delete[], because delete
* would only delete the first element! */
delete[] p;
答案 0 :(得分:9)
从man page的引用中,听起来像glTexImage2D分配了自己的内存。 这是有道理的,理想情况下,OpenGL API会发送数据存储在显卡本身(如果允许驱动程序/实现/等)。
在GL 1.1或更高版本中,像素可能是空指针。 在这种情况下,纹理存储器被分配以容纳纹理 宽度和高度的高度。然后,您可以下载子纹理 初始化此纹理内存。如果用户尝试,则图像未定义 应用未初始化的纹理部分 图像到原始。
所以,我想,一旦你生成纹理,释放记忆就没有害处。
答案 1 :(得分:1)
是的,在调用geTexImage2D()
后,可以放弃传递给它的数据。事实上,如果你不这样做,你会有内存泄漏,就像在这段代码中一样:
int *getPixels()
{
int *pixels = new int[10];
pixels[0] = 1;
pixels[1] = 0;
pixels[1] = 1;
// etc...
}
glTexImage2D(..., getPixels());
您将指向缓冲区的指针传递给调用,但指针丢失并且很可能会泄漏。您应该做的是存储它并在呼叫返回后删除它:
int *pbuf = getPixels();
glTexImage2D(..., pbuf);
delete[] pbuf;
另外,如果纹理的大小是常量,你可以将指针传递给堆栈中的数组:
{
int buf[10];
...
glTexImage2D(..., pbuf);
}
最后,如果您不想担心指针和数组,可以使用STL:
vector<int> buf;
fillPixels(buf);
getTexImage2D(..., buf.begin());
答案 2 :(得分:0)
我认为你需要在完成像素绘制后调用glDeleteTextures()来释放内存。