3

Cocos2d 2.1 beta4 で追加された新しいクリッピング ノードをテストしていますCCClippingNode。ただし、以下の方法を使用してクリップされたノードのスクリーンショットを撮ることができません。最終結果は、クリップされていない画像です。ここで新しいビルドを見つけることができます: http://www.cocos2d-iphone.org/download

+ (UIImage *) screenshotNode:(CCNode*)startNode {
    [CCDirector sharedDirector].nextDeltaTimeZero = YES;

    CGSize winSize = [CCDirector sharedDirector].winSize;

    CCRenderTexture * rtx = [CCRenderTexture renderTextureWithWidth:winSize.width height:winSize.height];

    [rtx begin];
    [startNode visit];
    [rtx end];

    return [rtx getUIImage];
}
4

2 に答える 2

4

推奨される解決策

次のコードは Cocos2d v2.1 で動作するようです:

+ (UIImage *) screenshotNode:(CCNode*)startNode {
    [CCDirector sharedDirector].nextDeltaTimeZero = YES;

    CGSize winSize = [CCDirector sharedDirector].winSize;

    CCRenderTexture * rtx =
        [CCRenderTexture renderTextureWithWidth:winSize.width
                                         height:winSize.height
                                    pixelFormat:kCCTexture2DPixelFormat_RGBA8888
                             depthStencilFormat:GL_DEPTH24_STENCIL8];

    [rtx beginWithClear:0 g:0 b:0 a:0 depth:1.0f];
    [startNode visit];
    [rtx end];

    return [rtx getUIImage];
}

説明

元のコードを機能させるには、次の 2 つの変更が必要でした。

  1. depthStencilFormatオブジェクト作成時にパラメータを指定しCCRenderTextureます。デフォルトでCCRenderTextureは、深度/ステンシル バッファは作成されません。
    • 少なくとも v2.1 では、ステンシル バッファーを作成するには、パラメーターdepthStencilFormatをに設定する必要があります。GL_DEPTH24_STENCIL8初期化コードは、CCRenderTexture特にこの値をチェックします。
  2. の代わりに のbeginWithClear深度値を使用して呼び出します。 1.0fbegin
    • 呼び出すだけでbeginは深度バッファがクリアされないようです。内部CCClippingNodeでは、 を使用して深度バッファへの書き込みが無効glDepthMask(GL_FALSE)になっていますが、深度テストは引き続き有効になっています。深度バッファーがクリアされないため、深度テストが失敗し、ステンシルが描画されない可能性があります。

また、ステンシルを使用するには、最初にでCCGLView作成する必要があります。depthFormat:GL_DEPTH24_STENCIL8_OESCCClippingNode

于 2013-11-09T06:55:46.650 に答える