将像素传递给glTexImage2D()后会发生什么?

时间:2009-04-19 21:45:39

标签: c++ opengl glteximage2d

例如,如果我创建一个像素数组,如下所示:

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;

3 个答案:

答案 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()来释放内存。