2011-12-14 6 views
1

투명 텍스처를 구체 위에 페인트하려고했지만 투명 영역이 완전히 투명하지 않습니다. 회색의 생생한 그늘이 남아 있습니다.iPhone OpenGL 텍스처가 완전히 투명하지 않음

- (void) loadPNGTexture: (int)index Name: (NSString*) name{ 
    CGImageRef imageRef = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",name]].CGImage; 

    GLsizei width = CGImageGetWidth(imageRef); 
    GLsizei height = CGImageGetHeight(imageRef); 
    GLubyte * data = malloc(width * 4 * height); 
    if (!data) 
     NSLog(@"error allocating memory for texture loading!"); 
    else { 
     NSLog(@"Memory allocated for %@", name); 
    } 

    NSLog(@"Width : %d, Height :%d",width,height); 
    CGContextRef cg_context = CGBitmapContextCreate(data, width, height, 8, 4 * width, CGImageGetColorSpace(imageRef), kCGImageAlphaPremultipliedLast);//kCGImageAlphaPremultipliedLast); 
    CGContextTranslateCTM(cg_context, 0, height); 
    CGContextScaleCTM(cg_context, 1, -1); 
    CGContextDrawImage(cg_context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(cg_context); 
    CGContextSetBlendMode(cg_context, kCGBlendModeCopy); //kCGBlendModeCopy); 

    glGenTextures(2, m_texture[index]); 
    glBindTexture(GL_TEXTURE_2D, m_texture[index][0]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    free(data); 
} 

그리기 구름 :

glPushMatrix(); 
glTranslatef(0, 0, 3 ); 
glScalef(3.1, 3.1, 3.1); 
glRotatef(-1, 0, 0, 1); 
glRotatef(90, -1, 0, 0); 
glDisable(GL_LIGHTING); 

//Load Texture for left side of globe 
glBindTexture(GL_TEXTURE_2D, m_texture[CLOUD_TEXTURE][0]); 
glVertexPointer(3, GL_FLOAT, sizeof(TexturedVertexData3D), &VertexData[0].vertex); 
glNormalPointer(GL_FLOAT, sizeof(TexturedVertexData3D), &VertexData[0].normal); 
glTexCoordPointer(2, GL_FLOAT, sizeof(TexturedVertexData3D), &VertexData[0].texCoord); 
// draw the sphere 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_COPY); 
glDrawArrays(GL_TRIANGLES, 0, 11520); 


glEnable(GL_LIGHTING); 

glPopMatrix(); 
+1

코드의 (관련 섹션)을 보여주십시오. 이상적으로 우리가 스스로해볼 수있는 최소한의 것. 텍스처에 투명도/알파 채널이 있는지 확인 하시겠습니까? – Bart

+0

'glEnable (GL_LIGHTING)'을 활성화 시켰습니까? 나는 이것이 "material"음영에 영향을 주거나 추가 할 수 있다고 믿는다. glMaterial (...)을 보아라. – epatel

+0

@epatel 더 자세히 기술해라. – AVEbrahimi

답변

0

서이 먼저 텍스처를로드

내 코드 : 나는 다음 포토샵 생성 된 PNG를로드 아래의 코드를 사용하여 영역에 페인트 시도 코드에서 아웃 라인 :

glBlendFunc(GL_SRC_ALPHA, GL_COPY); 

두 번째 인수 (GL_COPY) glBlendFunc의 경우 a valid argument이 아닙니다. 그 라인을 따라 무언가로 바꿀 수도 있습니다.

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
관련 문제