Cocos2d v3 Apply Shader on Children

I am currently playing with shaders in Cocos2d. My goal is to apply a shader to the entire screen (except for one node and its children) to have an overlay menu while the game is blurry.

Now I found this tutorial for working with shaders in cocos2D, resulting in the following code

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];

What really applies embossing to the sprite, however, when I add children to this sprite, the shader does not apply there, how can I do it? My scene contains many children, and adding and removing shaders with a loop for each child does not seem right to me.

+3
source share
2 answers

, - CCRenderTexture . CCSprite, . .

+1

Cocos-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
+1

All Articles