在OpenGL ES中隐藏图像部分

问题描述:

我正在使用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

通常,这与第二纹理是alpha map完成。在着色器中,alpha纹理将具有完全不透明的区域以及完全透明的其他区域。 alpha纹理的alpha通道乘以图像纹理alpha以获得最终的颜色。