2009-08-17 3 views
2

아이폰에서 텍스처를 스프라이트로 사용하여 2 차원 게임을 쓰고 있습니다. 일부 이미지는 렌더링되지만 (예 : 텍스처 그 자체, 그것 주위의 투명한 부분에서만). 문제는 나머지 텍스처에서는 발생하지 않습니다. 텍스처를로드하는 데 사용하는 코드는 다음과 같습니다.iphone 용 openGL을 사용하여 일부 텍스처를로드 할 때 이상한 색상

- (void)loadTexture:(NSString*)nombre { 

CGImageRef textureImage = [UIImage imageNamed:nombre].CGImage; 
if (textureImage == nil) { 
NSLog(@"Failed to load texture image"); 
return; 
} 

textureWidth = NextPowerOfTwo(CGImageGetWidth(textureImage)); 
textureHeight = NextPowerOfTwo(CGImageGetHeight(textureImage)); 

imageSizeX= CGImageGetWidth(textureImage); 
imageSizeY= CGImageGetHeight(textureImage); 

GLubyte *textureData = (GLubyte *)malloc(textureWidth * textureHeight * 4); 

CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage); 

CGContextRelease(textureContext); 

glGenTextures(1, &textures[0]); 

glBindTexture(GL_TEXTURE_2D, textures[0]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

free(textureData); 

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

glEnable(GL_BLEND); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

} 
+0

캡쳐 화면을 제공 할 수 있습니까? –

답변

4

이미지를 그리기 전에 메모리가 제로화되지 않습니다. 재미있는 픽셀은 이미지의 투명한 영역에있는 오래된 데이터입니다. malloc 대신 calloc을 사용하십시오 (calloc은 0이 아닌 메모리를 반환합니다).

이미지를 그리기 전에 CGContextSetBlendMode(textureContext, kCGBlendModeCopy);을 사용할 수도 있습니다. 때문에 malloc에 ​​작은 할당 크기에 대해 서로 다른 코드 경로를 가지고 있다는 사실을

이 문제는 작은 이미지 만 존재합니다

당신이 모든 이야기를 알고 싶다면

. 사용자 공간에서 관리하는 풀에서 작은 블록을 반환합니다. 요청 된 크기가 특정 임계 값 (16K, 나는 믿는다)보다 크면, malloc은 커널에서 메모리를 가져옵니다. 새 페이지는 물론 제로입니다.

알아내는 데 시간이 오래 걸렸습니다.

+0

문제가 해결되었습니다. 도움을 주셔서 감사합니다. –

관련 문제