2013-02-21 2 views
0

iOS 앱에서 일부 스프라이트를 렌더링하기 위해 GLKView를 사용하고 있습니다.OpenGL ES의 이미지 부분 숨기기

제 질문은, 어떻게 하나의 이미지의 일부분 만 제거하거나 그릴 수 있습니까? 예를 들어 배경이 있고 그 위에 이미지 (둘 다 스프라이트)가 있습니다. 상단의 이미지에서 임의의 직사각형을 가져 와서 배경이 사각형에 표시됩니다. 그게 가능하니?

- (id)initWithFile:(NSString *)fileName effect:(GLKBaseEffect *)effect position:(GLKVector2)position{ 
    if ((self = [super init])) { 
     self.effect = effect; 

     NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], 
            GLKTextureLoaderOriginBottomLeft, 
            nil]; 

     NSError * error;  
     NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil]; 
     self.textureInfo = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error]; 


     self.contentSize = CGSizeMake(self.textureInfo.width, self.textureInfo.height); 


     TexturedQuad newQuad; 
     newQuad.bl.geometryVertex = CGPointMake(0, 0); 
     newQuad.br.geometryVertex = CGPointMake(self.textureInfo.width, 0); 
     newQuad.tl.geometryVertex = CGPointMake(0, self.textureInfo.height); 
     newQuad.tr.geometryVertex = CGPointMake(self.textureInfo.width, self.textureInfo.height); 

     newQuad.bl.textureVertex = CGPointMake(0, 0); 
     newQuad.br.textureVertex = CGPointMake(1, 0); 
     newQuad.tl.textureVertex = CGPointMake(0, 1); 
     newQuad.tr.textureVertex = CGPointMake(1, 1); 
     self.quad = newQuad; 


     self.position = position; 

     self.frameHeight = self.textureInfo.height; 

    } 
    return self; 
} 

을 그리고 일반적으로 이것이 alpha map 인 제 2 텍스처와 수행이

- (void)render { 

    self.effect.texture2d0.name = self.textureInfo.name; 
    self.effect.texture2d0.enabled = YES;   

    self.effect.transform.modelviewMatrix = self.modelMatrix; 

    [self.effect prepareToDraw]; 

    long offset = (long)&_quad; 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 

    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex))); 
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex))); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

} 
+0

쿼드에 프래그먼트 셰이더를 사용하여 원하지 않는 픽셀을 거부하거나 올바른 텍스처 좌표로 더 복잡한 지오메트리를 사용하여 유지하려는 부분 만 그릴 수 있습니다. – IronMensan

답변

1

처럼 렌더링 :

나는이처럼 내 텍스처를 만드는거야. 셰이더에서 알파 텍스처는 완전히 불투명 한 영역과 완전히 투명 한 다른 영역을 갖습니다. 알파 텍스처의 알파 채널에 이미지 텍스처 알파를 곱하여 최종 색상을 얻습니다.