2014-02-26 17 views
3

目前我正在Cocos2d中着色器周围。我的目标是在整个屏幕上应用着色器(除了一个节点和它的子节点),以便在游戏模糊时制作叠加菜单。Cocos2d v3在子节点上应用着色器

现在我发现this tutorial与在cocos2d着色器导致下面的代码工作

CCSprite *aSprite = [CCSprite spriteWithImageNamed:@"Default.png"]; 
aSprite.contentSizeType = CCSizeTypeNormalized; 
aSprite.contentSize = CGSizeMake(0.5,0.5); 

NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"CSEEmboss" ofType:@"fsh"]; 
const GLchar * fragmentSource = (GLchar*) [[NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:nil] UTF8String]; 
aSprite.shaderProgram = [[CCGLProgram alloc] initWithVertexShaderByteArray:ccPositionTextureA8Color_vert 
                fragmentShaderByteArray:fragmentSource]; 
[aSprite.shaderProgram addAttribute:kCCAttributeNamePosition index:kCCVertexAttrib_Position]; 
[aSprite.shaderProgram addAttribute:kCCAttributeNameTexCoord index:kCCVertexAttrib_TexCoords]; 
[aSprite.shaderProgram link]; 
[aSprite.shaderProgram updateUniforms]; 

[aSprite.shaderProgram use]; 

[self.scene addChild:aSprite]; 

这的确适用印纹的精灵,但是当我添加子到精灵,不应用着色器在那里,我应该怎么做呢?我的场景包含许多孩子,添加和删除着色器的循环给每个孩子似乎并不适合我。

回答

1

经过一番研究,我认为最好的方法是使用CCRenderTexture并制作其他界面的截图。然后在由渲染纹理生成的CCSprite上使用模糊着色器。然后,您可以将您的菜单界面放置在渲染纹理上方。

+1

是啊,这是我们去的方式。仅使用iOS库来捕获屏幕和Core Graphics以模糊。 – Matthijn

1

下面是一个科科斯-2D的OBJ-C友好的执行情况http://saeedoo.com/?p=644(的Cocos2D-X)类似一个

一个ShaderNode的所有子节点将使用给定的着色器进行渲染。

通过首先将所有子节点渲染到CCTextureNode中,然后使用给定着色器渲染该纹理,完成着色。

ShaderNode.h

#import "CCNode.h" 

@interface ShaderNode : CCNode 
-(id)initWithShader:(CCShader*)shader; 
@end 

ShaderNode.m

#import "ShaderNode.h" 
#import "cocos2d.h" 

@implementation TRShaderNode 
{ 
    CCShader *_shader; 
    CCRenderTexture *_renderTexture; 
    CCSprite *_sprite; 
} 

- (id)initWithShader:(CCShader*)shader { 
    self = [super init]; 
    if (self) { 
     NSAssert(shader, @"Shader cannot be nil."); 
     _shader = shader; 
     CGSize size = [[CCDirector sharedDirector] viewSize]; 
     _renderTexture = [[CCRenderTexture alloc] initWithWidth:size.width height:size.height pixelFormat:CCTexturePixelFormat_RGBA8888]; 

     _sprite = [[CCSprite alloc] initWithTexture:_renderTexture.texture rect:CGRectMake(0, 0, _renderTexture.texture.contentSize.width, _renderTexture.texture.contentSize.height)]; 
     _sprite.position = CGPointZero; 
     _sprite.anchorPoint = CGPointZero; 
     _sprite.shader = _shader; 
    } 
    return self; 
} 

-(void)visit:(CCRenderer *)renderer parentTransform:(const GLKMatrix4 *)parentTransform { 
    CCRenderer *textureRenderer = [_renderTexture beginWithClear:0 g:0 b:0 a:0]; 
    for (CCNode *node in self.children){ 
     [node visit:textureRenderer parentTransform:parentTransform]; 
    } 
    [_renderTexture end]; 
    [_sprite visit:renderer parentTransform:parentTransform]; 
} 

@end