我正在测试在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];
}
答案 0 :(得分: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];
}
<强>解释强>
为了使原始代码有效,需要进行以下两项更改:
depthStencilFormat
对象时指定CCRenderTexture
参数。默认情况下,CCRenderTexture
不会创建深度/模板缓冲区。
depthStencilFormat
参数必须设置为GL_DEPTH24_STENCIL8
才能创建模板缓冲区,至少在v2.1中。 CCRenderTexture
初始化代码专门检查此值。beginWithClear
而不是1.0f
来呼叫begin
。
begin
永远不会清除深度缓冲区。在CCClippingNode
内,使用glDepthMask(GL_FALSE)
禁用写入深度缓冲区,但仍启用深度测试。由于深度缓冲区永远不会被清除,我怀疑深度测试失败了,导致模板永远不被绘制。此外,必须使用CCGLView
创建depthFormat:GL_DEPTH24_STENCIL8_OES
,以便CCClippingNode
首先使用模板。
答案 1 :(得分:0)
问题是我没有正确设置我的CCGLView。我必须将深度格式设置为GL_DEPTH24_STENCIL8_OES而不是值0
在AppController.mm中设置depthFormat