Ios CCClippingNode-cocos2d-iphone-2.1-beta4截图
我正在测试cocos2d2.1beta4Ios 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].
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];
}