0

GLKViewを使用して、iOSアプリでいくつかのスプライトをレンダリングしています。

私の質問は、1つの画像の一部だけを削除/描画するにはどうすればよいですか?たとえば、背景があり、その上に画像(両方のスプライト)があります。上の画像からランダムな長方形をいくつか取り出して、それらの長方形に背景が表示されるようにします。それは可能ですか?

私は次のようなテクスチャを作成しています:

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

}
4

1 に答える 1

1

通常、これはアルファ マップである 2 番目のテクスチャで行われます。シェーダーでは、アルファ テクスチャには完全に不透明な領域と、完全に透明な領域があります。アルファ テクスチャのアルファ チャネルにイメージ テクスチャ アルファを乗算して、最終的な色を取得します。

于 2013-02-21T19:01:00.687 に答える