2014-02-26 16 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