2016-06-06 2 views
0

다음의 간단한 코드에서 텍스처에 1 채널 데이터를로드합니다. 나는 glTexImage2D()GL_LUMINANCE (1 채널 형식 임)과 GL_UNSIGNED_BYTE으로 사용하므로 픽셀 당 1 바이트가 필요합니다. 입력 픽셀 데이터를 나타내는 픽셀 수 (2 x 2)와 동일한 크기의 버퍼를 할당합니다 (픽셀 값은 우리의 목적에 상관 없습니다).glTexImage2D는 버퍼의 경계 (iOS)를 넘어서 읽습니다.

#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); 

: 당신은 소독제를 사용할 주소와 다음 코드를 실행하면

는, 그것이 힙 - 할당 된 버퍼의 경계를 넘어 읽으려고한다는, glTexImage2D()에 대한 호출에서 힙 버퍼 오버 플로우를 감지 이것은 100 % 재현 가능하며 iOS 시뮬레이터와 장치 모두에서 발생합니다. 버퍼의 크기를 6으로 늘리면 오버플로가 발생하지 않습니다 (예상 크기 인 4보다 2 크다).

1x1과 4x4의 크기에는이 문제가없는 것 같지만 2x2와 3x3은 있습니다. 그것은 다소 독창적 인 것처럼 보입니다.

무엇이 잘못 되었나요?

+1

'GL_UNPACK_ALIGNMENT'이 '1'로 설정되어 있습니까? – genpfault

답변

0

@ genpfault의 의견 덕분에 해결되었습니다.

I는 1 행을 풀고 배향을 설정해야

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

즉,을 풀고 정렬 각 행의 개시에 대한 정렬을 결정한다. 기본값은 4입니다. 행에 특수 정렬이없고 행 바이트 사이에 간격이 없기 때문에 정렬은 1이어야합니다.

malloc은 16 정렬 버퍼를 할당하므로 첫 번째 행은 항상 정렬됩니다. . 그러나 행 길이가 4의 배수가 아니면 두 번째 및 후속 행이 기본 정렬 4로 정렬되지 않았습니다 (2x2 및 3x3이 작동하지 않는 이유는 설명하지만 4x4는이를 수행합니다). 1x1은 두 번째 행이 없기 때문에 작동합니다.

관련 문제