2016-06-06 24 views
0

在以下簡單代碼中,我將1通道數據加載到紋理。我使用glTexImage2D()GL_LUMINANCE(這是一個通道格式)和GL_UNSIGNED_BYTE,所以它應該每個像素需要一個字節。我分配一個大小等於表示輸入像素數據的像素數(2 x 2)的緩衝區(像素值對於我們的目的而言不重要)。glTexImage2D讀取超出緩衝區範圍(iOS)

當您運行與地址啓用消毒下面的代碼,它檢測到呼叫glTexImage2D()堆緩衝區溢出,稱它試圖讀取超出堆分配的緩衝區的邊界:

#import <OpenGLES/ES2/gl.h> 

//... 

EAGLContext* context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
[EAGLContext setCurrentContext:context]; 

GLsizei width = 2, height = 2; 
void *data = malloc(width * height); // contents don't matter for now 
glTexImage2D(GL_TEXTURE_2D, 
      0, 
      GL_LUMINANCE, 
      width, 
      height, 
      0, 
      GL_LUMINANCE, 
      GL_UNSIGNED_BYTE, 
      data); 

這是100%可重複的,併發生在iOS模擬器和設備上。只有當你將緩衝區的大小增加到6時,它纔會溢出(比預期的大小4大2)。

尺寸1x1和4x4似乎沒有這個問題,但2x2和3x3做。它似乎有點武斷。

出了什麼問題?

+1

GL_UNPACK_ALIGNMENT設置爲1嗎? – genpfault

回答

0

感謝@ genpfault的評論,我解決了它。

我需要解包對準設置爲1:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

具體而言,解包對準確定每個行的開始對準。默認值是4,由於我行沒有任何特殊的定位,並有行的字節之間沒有間隙,排列應爲1

第一行會始終保持一致,因爲malloc分配16對齊的緩衝區。但第二行和後續的行與默認對齊方式4錯開,除非行長度是4的倍數(這解釋了爲什麼2x2和3x3不起作用,但是4x4起作用)。 1x1恰好工作,因爲它沒有第二行。