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];
}

解释

要使原始代码正常工作,需要进行以下两项更改:

  1. depthStencilFormat创建CCRenderTexture对象时指定参数。默认情况下,CCRenderTexture不创建深度/模板缓冲区。
    • depthStencilFormat参数必须设置为GL_DEPTH24_STENCIL8才能创建模板缓冲区,至少在 v2.1 中。CCRenderTexture初始化代码专门检查这个值。
  2. beginWithClear使用深度值1.0f而不是调用begin
    • 似乎只是调用begin永远不会清除深度缓冲区。在内部CCClippingNode,使用 禁用写入深度缓冲区glDepthMask(GL_FALSE),但仍启用深度测试。由于深度缓冲区永远不会被清除,我怀疑深度测试失败,导致模板永远不会被绘制。

此外,CCGLView必须首先创建模板depthFormat:GL_DEPTH24_STENCIL8_OES才能CCClippingNode使用模板。

于 2013-11-09T06:55:46.650 回答
0

问题是我没有正确设置我的 CCGLView。我必须将深度格式设置为 GL_DEPTH24_STENCIL8_OES 而不是值 0

在 AppController.mm 中设置 depthFormat

在此处输入图像描述

于 2014-01-10T09:19:14.893 回答