2009-04-19 31 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()完成繪製像素之後,以釋放內存。

相關問題