2013-02-21 92 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 2013-02-21 18:55:53

回答

1

通常,這與第二紋理是alpha map完成。在着色器中,alpha紋理將具有完全不透明的區域以及完全透明的其他區域。 alpha紋理的alpha通道乘以圖像紋理alpha以獲得最終的顏色。