2009-04-19 98 views
9

例如,如果我创建像素阵列,像这样:将像素传递给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; 

回答

9

从这个报价在man page,这听起来像glTexImage2D分配自己的内存。 这是有道理的,理想情况下,OpenGL API将发送数据存储在显卡本身(如果驱动程序/实现/等允许)。

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

所以是的,我会想象一旦你产生你的纹理,释放内存没有任何伤害。

+0

我不确定PC上是否出现这种情况,但是在控制台上,纹理上传功能通常只是将指针存储到纹理中,并为以后的时间安排DMA传输,因此只要函数返回,就不能释放内存。 – n0rd 2012-01-23 13:04:55

1

是的,在致geTexImage2D()返回之后,放弃传递给它的数据是安全的。逸岸,如果你不这样做,你就会有内存泄漏,像这样的代码:

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

glTexImage2D(..., getPixels()); 

您传递的指针缓冲区呼叫,但把指针丢失,最有可能的泄漏。你应该做的是保存它并删除它aftet通话retuns:

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

alternativly,如果纹理是一个常量的大小,你可以传递一个指向数组的指针是在栈上:

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

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

vector<int> buf; 
fillPixels(buf); 
getTexImage2D(..., buf.begin()); 
+0

糟糕!我的初始片段使用delete来代替delete []来删除像素缓冲区。 – 2009-04-19 22:42:53

0

我认为你需要调用glDeleteTextures()完成绘制像素之后,以释放内存。

相关问题