cocos渲染引擎分析(五)-----FBO实现多分辨率渲染

上章讲了RenderTexture的流程,然而有些需求cocos提供的并不能实现。在PC上玩游戏的时候,我们可以在设置选项里设置游戏分辨率,模糊,清晰,高清,然而cocos引擎只支持一种渲染分辨率,手机分辨率多少,就会渲染出同样分辨率的图片,这样对某些消耗大3D游戏,在低端手机就会很卡。因此,本章主要讲怎么实现基于FBO的多分辨率渲染。

多分辨率渲染的思路如下:首先创建FBO,然后渲染场景时,设置当前新FBO,并绑定当前FBO,设置视口大小(根据图像清晰度设置),完成后恢复到系统帧缓存,将FBO渲染到的纹理放大渲染到系统默认缓存上,此外,在渲染到默认系统前,可以对图像进行各种操作,如模糊,提亮等。

上章已经具体讲了RenderTexture,下面直接贴代码,RenderTexture加入下面代码:

void RenderTexture::beginFrameBuffer()
{
	glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_oldFBO);
	glBindFramebuffer(GL_FRAMEBUFFER, _FBO);
	{
		Rect viewport;
		viewport.size.width = _fullviewPort.size.width;
		viewport.size.height = _fullviewPort.size.height;
		float viewPortRectWidthRatio = float(viewport.size.width) / _fullRect.size.width;
		float viewPortRectHeightRatio = float(viewport.size.height) / _fullRect.size.height;
		viewport.origin.x = (_fullRect.origin.x - _rtTextureRect.origin.x) * viewPortRectWidthRatio;
		viewport.origin.y = (_fullRect.origin.y - _rtTextureRect.origin.y) * viewPortRectHeightRatio;
		glViewport(viewport.origin.x, viewport.origin.y, (GLsizei)viewport.size.width, (GLsizei)viewport.size.height);
	}
	glClearColor(0.0,0.0,0.0,1.0);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LESS);
	glDepthMask(TRUE);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glClear(GL_DEPTH_BUFFER_BIT);
}
void RenderTexture::endFrameBuffer()
{
	glBindFramebuffer(GL_FRAMEBUFFER, _oldFBO);
	Director *director = Director::getInstance();
	director->setViewport();
	auto glView = director->getOpenGLView();
	auto frameSize = glView->getFrameSize();
	glViewport(0, 0, frameSize.width, frameSize.height);
	auto size = director->getWinSize();
	_texture->drawInRect(Rect(0, 0, size.width, size.height));
	
}

然后,渲染器Render的render中加入下面代码:


	if (_renderTexture == nullptr)
	{
		auto director = Director::getInstance();
		auto glView = director->getOpenGLView();
		auto frameSize = glView->getFrameSize();
		_renderTexture = RenderTexture::create(frameSize.width / 2, frameSize.height/2, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8);
		_renderTexture->retain();
	}
	_renderTexture->beginFrameBuffer();
       for(.........)
       {
	      auto glView = director->getOpenGLView();
		  auto frameSize = glView->getFrameSize();
		  glViewport(0, 0, frameSize.width/2, frameSize.height/2);
       }
	  _renderTexture->endFrameBuffer();

降低分辨率后图像模糊,绘制的时候更改过滤模式如下:


	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);

 

你可能感兴趣的:(图形算法,COCOS)