2011-06-24 16 views
3

私は実際にこれを理解しようと狂っているので、どんな助けでも本当に感謝します。私はスプライトの大部分を隠して、それを徐々に見せようとしています。私は長方形でのみ動作する場合、これは正常に動作します。例えば、私は「ClippingNode」クラスの誰かの実装を発見し、それがうまく働いていた、すなわち、このコードの一部:cocos2d - スプライトの一部のみを表示する不規則な形状

-(void) visit 
{ 
    glPushMatrix(); 
    glEnable(GL_SCISSOR_TEST); 
    glScissor(clippingRegion.origin.x + positionInPixels_.x, clippingRegion.origin.y + positionInPixels_.y, clippingRegion.size.width, clippingRegion.size.height); 

    [super visit]; 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix(); 
} 

は、問題は、私は不規則な形状だけでなく、長方形を必要です。私は、glScissorへの呼び出しをスタックし、より小さな四角形を多く含む形を作成することを望んでいましたが、残念ながらglScissorは一度しか呼び出されませんでした。

cocos2dはOpenGLsのステンシルバッファをサポートしていないようですが、それがあってもOpenGLが分かりにくいことがわかりました。スプライト上のベジェパスをマスク(私がQuartzでできると思う)に設定できるなら、それは素晴らしいでしょうが、サポートされているようには見えません。

ここに知恵がある人は、すごくいいですね。

+0

を、私は別の方法を頼むよ:誰もがCCNodeの「訪問」の上記の実装を変更することはできクリップしますclippingRegion.originを中心とした半径40の円へのノードの内容? – johnnysports

+0

これは、円でクリップするのにうまく機能するようになったのですか? – jin

答えて

1

glScissorでは不可能ですが、ステンシルバッファを使用すると簡単にこの効果を得ることができます。ここではドキュメントは次のとおりです。

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

ありステンシルバッファ上の訥河のチュートリアルでもあるが、(あなたが必要なものは何でもアプリケーションに変換する簡単なはずですが)、それはC++、ないのObjective Cである:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26

EDIT:これは、あなたには、いくつかの任意の形状にそれをクリップするという仮定に基づいており、例えばスター、どんなスマイリー、だけではなく、長方形の。

+0

最初のリンクが壊れています – Grumdrig

1

あなたはあなただけのもその形状を毎回シザリング描画する必要がある、複数回glScissorを呼び出すことができます。実際には

-(void) visit 
{ 
    NSEnumerator *enumerator; 
    NSValue *val; 
    CGRect aRegion; 

    glPushMatrix(); 
    glEnable(GL_SCISSOR_TEST); 

    enumerator = [regions objectEnumerator]; 
    while ((val = (NSValue *)[enumerator nextObject])) { 
     aRegion = [val CGRectValue]; 

     glScissor(aRegion.origin.x, aRegion.origin.y, 
        aRegion.size.width, aRegion.size.height); 
     [super visit]; 
    } 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix();  

} 
関連する問題