10

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

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;
4

3 回答 3

9

手册页中的这句话来看,听起来 glTexImage2D 分配了自己的内存。这是有道理的,理想情况下,OpenGL API 会发送数据以存储在显卡本身上(如果驱动程序/实现/等允许)。

在 GL 版本 1.1 或更高版本中,像素可能是空指针。在这种情况下,纹理内存被分配以容纳宽度宽度和高度高度的纹理。然后,您可以下载子纹理来初始化此纹理内存。如果用户尝试将纹理图像的未初始化部分应用于图元,则图像未定义。

所以是的,我想一旦你生成了你的纹理,释放内存并没有什么坏处。

于 2009-04-19T21:52:25.343 回答
1

是的,在调用geTexImage2D()返回之后,丢弃传递给它的数据是安全的。事实上,如果你不这样做,你就会有内存泄漏,就像在这段代码中一样:

int *getPixels()
{
    int *pixels = new int[10];
    pixels[0] = 1;
    pixels[1] = 0;
    pixels[1] = 1;
    // etc...
}

glTexImage2D(..., getPixels());

您将指向缓冲区的指针传递给调用,但随后指针丢失并且很可能泄漏。您应该做的是存储它并在调用 retuns 后将其删除:

int *pbuf = getPixels();
glTexImage2D(..., pbuf);
delete[] pbuf;

或者,如果纹理的大小是恒定的,则可以将指针传递给堆栈上的数组:

{
    int buf[10];
    ...
    glTexImage2D(..., pbuf);
}

最后,如果不想担心指针和数组,可以使用 STL:

vector<int> buf;
fillPixels(buf);
getTexImage2D(..., buf.begin());
于 2009-04-19T22:21:08.410 回答
0

我认为你需要在绘制完像素后调用 glDeleteTextures() 来释放内存。

于 2011-12-15T21:42:38.160 回答