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类吗