2013-02-21 2 views
0

Я использую GLKView для рендеринга некоторых спрайтов в приложении iOS.Скрыть части изображения в 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; 
} 

А затем сделать их как этот

- (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

Обычно это делается со второй текстурой, которая является alpha map. В шейдере текстура альфа будет иметь области, которые полностью непрозрачны, и другие области, которые полностью прозрачны. Альфа-канал альфа-текстуры умножается на текстуру альфа-изображения, чтобы получить окончательный цвет.

Смежные вопросы