2009-09-05 6 views
1

2つのレイヤーが描画されています。静的背景テクスチャと透明部分を持つテクスチャ(png)。私は問題なく背景を正しく見ることができます。私がしたいのは、実行時に変更されるサイズのポリゴン(四角形)を描画してトップレイヤーを変更することです。多角形が透明になるようにポリゴンを描き、ポリゴンがOpenGL ESにある場合

iphone用にCocos2dを使用していて、著者(#6を参照)がnice solutionを見つけましたが、彼の例では、別のPNGファイルをマスクとして使用しています。実行時に可変の高さと幅で透明部分が作成されるため、画像は機能しません。イメージ(マスク)を何度も描画するオーバーヘッドは、私にとっては思っていたほどです。

これはしばらくの間研究していましたが、ポリゴンをアルファチャンネルだけに描画することについて話をしていましたが、このチャンネルに描画するポリゴンを取得できました。より明るい色。

私はちょうど何か簡単な行方不明だということを期待しています:私はGL_ONE GL_ZERO GL_ALPHA_FROM_SRCなどの切り抜いた組み合わせのトンを試してみました

 RenderTexture *mBurnLayer = [RenderTexture renderTextureWithWidth:512 height:512]; 
    Sprite *burn = [Sprite spriteWithFile:@"bg-new.png"]; 
    [burn setPosition:cpv(480/2,320/2)]; 
    [mBurnLayer setPosition:cpv(256,256)]; 
    [mBurnLayer begin]; 
    glColorMask(TRUE, TRUE, TRUE, TRUE); 
    [burn visit]; 
    glColorMask(TRUE, TRUE, TRUE, FALSE); 
    [mBurnLayer end]; 
    [self addChild:mBurnLayer]; 

    [mBurnLayer begin]; 
    glColorMask(FALSE, FALSE, FALSE, TRUE); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
    glColor4ub(1, 1, 1, 0.5); 
    glLineWidth(10); 
    CGPoint vertices[] = { ccp(100,100), ccp(100,200), ccp(200,200), ccp(200,100) }; 
    drawPoly(vertices, 4, YES); 
    glColorMask(TRUE, TRUE, TRUE, TRUE); 

を....

はまた、多分読んで、私はちょうどに必要テクスチャをクリップしますか?これはシェーダなしでも可能ですか?私はiPhone 3GSがシェーダを行うことができることを知っていますが、以前のものはできません。

答えて

3

私はそれを理解しましたが、将来必要とする誰かが参照するためのコードはここにあります。

RenderTexture *bigBackgroundLayer = [RenderTexture renderTextureWithWidth:512 height:512]; 
Sprite *bigBackgroundSprite = [Sprite spriteWithFile:@"big_bg.png"]; 
[bigBackgroundSprite setPosition:cpv(240,150)]; 
[bigBackgroundLayer setPosition:ccp(240,150)]; 
[bigBackgroundLayer begin]; 
glColorMask(TRUE, TRUE, TRUE, TRUE); 
[bigBackgroundSprite visit]; 
glColorMask(TRUE, TRUE, TRUE, FALSE); 
[bigBackgroundLayer end]; 
[self addChild:bigBackgroundLayer z:0]; 

RenderTexture *gameBoardLayer = [RenderTexture renderTextureWithWidth:512 height:512]; 
Sprite *gameBoardSprite = [Sprite spriteWithFile:@"bg-new.png"]; 
[gameBoardSprite setPosition:cpv(480/2,320/2)]; 
[gameBoardLayer setPosition:cpv(256,256)]; 
[gameBoardLayer begin]; 
glColorMask(TRUE, TRUE, TRUE, TRUE); 
[gameBoardSprite visit]; 
glColorMask(TRUE, TRUE, TRUE, FALSE); 
[gameBoardLayer end]; 
[self addChild:gameBoardLayer]; 

[gameBoardLayer begin]; 
glColorMask(FALSE, FALSE, FALSE, TRUE); 
glBlendFunc(GL_ONE, GL_ZERO); 
glColor4ub(1, 1, 1, 0.0); 
glLineWidth(10); 
CGPoint vertices[] = { ccp(100,100), ccp(100,300), ccp(300,300), ccp(300,100) }; 
drawPoly(vertices, 4, YES); 
glColorMask(TRUE, TRUE, TRUE, TRUE); 
[gameBoardLayer end]; 

これは、bigBackgroundSpriteにgameBoardSpriteをブレンドします。組み込みのdrawPoly関数を使うと、これは矩形を線として描画するだけです.GLEnumモード(このコードではありません)のために余分なパラメータを取得し、GL_TRIANGLE_FANに設定してポリを塗りつぶすように関数を変更しました。

これは他の人にとって役に立ちます。

関連する問題