Hi @bolin:
my problem is maybe not the shader. I have a new approach, trying to render the frame buffer to a render texture and doing the required scaling on the render texture and not on the frame buffer sprite.
But the FPS are only 40 FPS. Maybe I am doing something wrong there. Could you kindly have a look? All I want to achieve is, apply shader on FBO and render it to a render texture which I will upscale to have a fullscreen display. Thank you!
// on "init" you need to initialize your instance
// add overall layer
mGameLayer = LayerColor::create(Color4B(128, 128, 128, 255));
this->addChild(mGameLayer, 0, 0);
float lFboScale = 1.0f;
auto lWinSize = Director::getInstance()->getWinSizeInPixels();
Size lRTexSize = Size(320 * lFboScale, 240 * lFboScale);
// create FrameBuffer
auto lFrameBufferSize = Size(320, 240);
auto lFrameBuffer = experimental::FrameBuffer::create(1, lFrameBufferSize.width, lFrameBufferSize.height);
lFrameBuffer->setClearColor(Color4F(0, 255, 0, 255));
auto lRenderTarget = experimental::RenderTarget::create(lFrameBufferSize.width, lFrameBufferSize.height, Texture2D::PixelFormat::RGB5A1);
lFrameBuffer->attachRenderTarget(lRenderTarget);
lFrameBuffer->getRenderTarget()->getTexture()->setAliasTexParameters(); // otherwise texture will be mushy after resize
auto lRenderTargetDepthStencil = experimental::RenderTargetDepthStencil::create(lFrameBufferSize.width, lFrameBufferSize.height);
lFrameBuffer->attachDepthStencilTarget(lRenderTargetDepthStencil);
// create texture from FrameBuffer
auto lFrameBufferSprite = Sprite::createWithTexture(lFrameBuffer->getRenderTarget()->getTexture());
lFrameBufferSprite->setPosition(lRTexSize.width / 2, lRTexSize.height / 2);
//lFrameBufferSprite->setPosition(lWinSize.width / 2, lWinSize.height / 2);
lFrameBufferSprite->setScale(lFboScale);// lWinSize.height / 240.0f); // zoom into to have full height off screen
lFrameBufferSprite->setFlippedY(true);
mFrameBufferSprite = lFrameBufferSprite;
mFrameBufferSprite->retain();
//mGameLayer->addChild(mFrameBufferSprite);
// create camera and set new viewport to zoom in and show picture with maximal height
auto camera = Camera::create();
camera->setCameraFlag(CameraFlag::USER1);
camera->setDepth(-1);
camera->setFrameBufferObject(lFrameBuffer);
float viewPortRectWidthRatio = static_cast<float>(lWinSize.width) / static_cast<float>(960);
float viewPortRectHeightRatio = static_cast<float>(lWinSize.height) / static_cast<float>(720);
float viewPortW = ceilf(viewPortRectWidthRatio * (float)1000.0) / (float)1000.0;
float viewPortH = ceilf(viewPortRectHeightRatio * (float)1000.0) / (float)1000.0;
experimental::Viewport lViewPort = experimental::Viewport(0.0, 0, viewPortW, viewPortH);
camera->setViewport(lViewPort);
this->addChild(camera);
// add sprite and set camera mask to it
sprite2 = Sprite::create("cut3x.png");
int fboWidth = lFrameBufferSprite->getTexture()->getContentSizeInPixels().width * 3;
int fboHeight = lFrameBufferSprite->getTexture()->getContentSizeInPixels().height * 3;
sprite2->setPosition(fboWidth / 2, fboHeight / 2);
sprite2->getTexture()->setAliasTexParameters();
sprite2->setCameraMask((unsigned short)CameraFlag::USER1);
mGameLayer->addChild(sprite2);
// create render texture
Size iGameLayerSize = lWinSize;
mRTex = RenderTexture::create(lRTexSize.width, lRTexSize.height, Texture2D::PixelFormat::RGB5A1);
mRTex->setPosition(iGameLayerSize.width / 2, iGameLayerSize.height / 2);
//mRTex->retain();
//mRTex->getSprite()->setCameraMask((unsigned short)CameraFlag::USER1);
mRTex->getSprite()->setScale(lWinSize.height / lRTexSize.height);
mGameLayer->addChild(mRTex);
// apply shader to FrameBuffer sprite
//InitHq4xShader(mFrameBufferSprite);
//lFrameBufferSprite->setPosition(lRTexSprite->getPositionX() + 160, lRTexSprite->getPositionY() + 120);
//this->setScale(3.0);
return true;
}
void HelloWorld::draw(cocos2d::Renderer* renderer, const cocos2d::Mat4 &transform, uint32_t flags)
{
//CCConsole::printSceneGraphBoot(0);
mRTex->begin();
mFrameBufferSprite->visit();
mRTex->end();
}
