cocos2d-x 3.8-如何设置后期处理

cocos2d-x 3.8-如何设置后期处理,cocos2d-x,cocos2d-x-3.0,Cocos2d X,Cocos2d X 3.0,如何将后处理过滤器应用于当前主层(如模糊整个屏幕等)?我想我应该创建一个新的渲染器,让主层每帧访问一次,但现在我不知道下一步该怎么做。 这是正确的方法吗 已解决:是的,我在那里占了50%,我所缺少的只是从RenderTexture生成的精灵,只需将它添加到场景中,瞧,它就在那里!重要提示:为此,您需要稍微重新构造场景,创建两个层,一个称为mainLayer,另一个称为postProcessingLayer,它们必须是同级,mainLayer包含所有精灵,postProcessingLayer包含

如何将后处理过滤器应用于当前主层(如模糊整个屏幕等)?我想我应该创建一个新的渲染器,让主层每帧访问一次,但现在我不知道下一步该怎么做。
这是正确的方法吗

已解决:是的,我在那里占了50%,我所缺少的只是从RenderTexture生成的精灵,只需将它添加到场景中,瞧,它就在那里!重要提示:为此,您需要稍微重新构造场景,创建两个层,一个称为mainLayer,另一个称为postProcessingLayer,它们必须是同级,mainLayer包含所有精灵,postProcessingLayer包含您刚刚通过RenderTexture创建的结果精灵。
如果我的解释不清楚,很抱歉,代码如下:
PP.cpp

PP::PP(){
    width = Director::getInstance()->getVisibleSize().width;
    height = Director::getInstance()->getVisibleSize().height;
    rt = RenderTexture::create(width, height);
    rt->retain();
}
Sprite* PP::getSprite(){
    if (rt){
        auto layer = Sprite::createWithTexture(rt->getSprite()->getTexture());
        layer->setFlipY(true);
        return layer;
    }
}
void PP::draw(Layer* layer){
    rt->begin();
    layer->visit();
    rt->end();
}
游戏场景.cpp

bool GameScene::init()
{
    scheduleUpdate();

    mainLayer = Layer::create();
    this->addChild(mainLayer);
    mainLayer->addChild(background);

    postProcessingLayer = Layer::create();
    this->addChild(postProcessingLayer, 1);
    filter= new PP();
    auto reverseRGBSprite = filter->getSprite();
    reverseRGBSprite->setPosition(visibleSize.width / 2, visibleSize.height / 2);
    CustomShader::reverseRGB(reverseRGBSprite);
    postProcessingLayer->addChild(reverseRGBSprite);

    postProcessingLayer2 = Layer::create();
    this->addChild(postProcessingLayer2, 2);
    auto blur = filter->getSprite();
    blur->setPosition(visibleSize.width / 2, visibleSize.height / 2);
    CustomShader::gaussianBlur(blur);
    postProcessingLayer2->addChild(blur);

    return true;
}

void GameScene::update(float delta){
    filter->draw(mainLayer);
    filter->draw(postProcessingLayer);
}
CustomShader.cpp

GLProgram* CustomShader::init(std::string const &vert,std::string const &frag){
    auto prog = new GLProgram();

    prog->initWithFilenames(vert, frag);
    prog->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
    prog->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
    prog->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORD);
    prog->link();
    prog->updateUniforms();

    return prog;
}

void CustomShader::reverseRGB(Sprite *sprite){
    auto prog = CustomShader::init("shaders/reverseRGB.vert", "shaders/reverseRGB.frag");

    sprite->setShaderProgram(prog);
}

什么是自定义着色器您可以制作自己的着色器供sprite使用,有很多教程:。我的“CustomShader”只是一个静态类,包含了使其工作所需的所有代码。你能给你的CustomShader类什么是CustomShader吗?你可以为sprite制作自己的着色器,有很多教程:。我的“CustomShader”只是一个静态类,包含了使其工作所需的所有代码。你能给出你的CustomShader类吗