Ios CCClippingNode-cocos2d-iphone-2.1-beta4截图

Ios CCClippingNode-cocos2d-iphone-2.1-beta4截图,ios,objective-c,cocos2d-iphone,screenshot,Ios,Objective C,Cocos2d Iphone,Screenshot,我正在测试cocos2d2.1beta4CCClippingNode中添加的新剪辑节点。但是,我无法使用下面的方法截取剪裁节点的屏幕截图。最终结果是未剪辑的图像。您可以在此处找到新版本: 建议的解决方案 以下代码似乎适用于Cocos2d v2.1: +(UIImage*)屏幕快照节点:(CCNode*)开始节点{ [CCDirector sharedDirector].nextDeltaTimeZero=是; CGSize winSize=[CCDirector sharedDirector].

我正在测试cocos2d2.1beta4
CCClippingNode
中添加的新剪辑节点。但是,我无法使用下面的方法截取剪裁节点的屏幕截图。最终结果是未剪辑的图像。您可以在此处找到新版本:


建议的解决方案

以下代码似乎适用于Cocos2d v2.1:

+(UIImage*)屏幕快照节点:(CCNode*)开始节点{
[CCDirector sharedDirector].nextDeltaTimeZero=是;
CGSize winSize=[CCDirector sharedDirector].winSize;
CCRenderTexture*rtx=
[CCRenderTexture renderTextWithWidth:winSize.width
高度:winSize.height
像素格式:KCCTexture2DPIxelFormatRGBA8888
深度模板格式:GL_DEPTH24_模板8];
[rtx beginWithClear:0G:0B:0A:0深度:1.0f];
[startNode访问];
[rtx结束];
返回[rtx getUIImage];
}
解释

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

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

  • 此外,必须使用
    depthFormat:GL_DEPTH24_STENCIL8_OES
    创建
    CCGLView
    ,以便
    CCClippingNode
    首先使用模具。

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

    在AppController.mm中设置depthFormat


    我可以想象,剪辑不适用于渲染纹理。如果您可以在一个简单的测试用例中验证这一点,那么您应该将其报告为一个bug。这非常有效。我们只需要设置深度属性。谢谢
    + (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];
    }