투명성이있는 PNG의 Opengl es 텍스처는 이상한 유물로 렌더링되고 나를 미치게합니다!

StackOverflow https://stackoverflow.com/questions/1079884

문제

첫 번째 OpenGL iPhone 앱에서 작업하기 시작했지만 일찍 걸려 넘어졌습니다.

나는 2D 게임에서 스프라이트로 사용하고 싶은 아주 간단한 작은 질감을 가지고 있지만, 이상한 '무작위로'컬러 픽셀을 위에 렌더링합니다.

http://i40.tinypic.com/2s7c9ro.png <- 여기 스크린 샷

나는 이것이 Photoshop의 잘못이라는 느낌을 얻습니다.

Photoshop이 아니라면 내 코드가되어야합니다 ... 여기에 문제가있는 코드가 있습니다 ...

- (void)loadTexture {

CGImageRef textureImage = [UIImage imageNamed:@"zombie0.png"].CGImage;

if (textureImage == nil) {
    NSLog(@"Failed to load texture image");
    return;
}

NSInteger texWidth = CGImageGetWidth(textureImage);
NSInteger texHeight = CGImageGetHeight(textureImage);

GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4);

CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast);

CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);

CGContextRelease(textureContext);

glGenTextures(1, &textures[0]);

glBindTexture(GL_TEXTURE_2D, textures[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

free(textureData);

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

glEnable(GL_TEXTURE_2D);

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

}

이 블렌드 기능은 최상의 결과를 얻었습니다.

제발, 당신이 잘못 생각하는 것을 알려주세요.

대단히 감사합니다.이 문제로 인해 나를 미치게 만들었습니다.

도움이 되었습니까?

해결책

코드에서 볼 수있는 한 가지 문제는 이미지를 그리기 전에 컨텍스트를 지우지 않는다는 것입니다. 이미지에는 투명한 영역이 포함되어 있으며 배경에 구성되어 있으므로 Malloc이 할당 한 메모리의 내용 만 볼 수 있습니다. 이미지를 그리기 전에 쿼츠 블렌드 모드를 복사 할 수 있습니다.

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

Calloc은 메모리가없는 메모리를 제공하기 때문에 Malloc 대신 Calloc을 사용할 수도 있습니다.

OpenGL 블렌딩이 정확합니다.

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

Porter-Duff "Over"를 제공합니다.

다른 팁

CGCONTEXTREF를 먼저 지우십시오.

CGContextSetRGBFillColor(ctxt, 1, 1, 1, 0);
CGContextFillRect(ctxt, CGRectMake(0, 0, w, h));

대부분의 이미지에는 알파 값이 0 인 컬러 픽셀이 있지만 블렌딩 함수로 인해 표시됩니다. 노력하다

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top