渲染图片

梦想游戏人
目录:
OpenGL

原理:

在一个矩形上面使用2D纹理贴图 从而显示图片

GL只识别bitmap 所以 jpeg png等格式要解码为bitmap 才能直接生成纹理->渲染

下面是Lite2D Text 渲染freetype生成的bitmap 字体的实现

void Text::draw()
{

	if (this->_is_need_update)
	{//need sync string
		this->clear();
		this->updateString();
		this->_is_need_update = false;
	}
	if (this->_is_need_update_color)
	{//need sync color
		this->updateColor();
		this->_is_need_update_color = false;
	}


	float width = 0;
	float height = 0;
//deal with each font with string 
	for (int i = 0; i < _queue.size(); i++)
	{
		CharBitMap*bitmap = _queue[i];


		glLoadIdentity();// vetex can work once

		glBindTexture(GL_TEXTURE_2D, bitmap->texture_id);

		// able alpha blend for the texture who has alpha
		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		//able opacity
		glEnable(GL_ALPHA_TEST);
		glAlphaFunc(GL_GREATER, 0.0f);
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);


		//start to render

		glBegin(GL_QUADS);

		//fix bug of transform of difference window size

		Vec2 windowsize = Director::getInstance()->getWindowSize();

		float xx = -1.0f; //position
		float yy = -1.0f;

		float scaleX = this->getGlobalScale().x; //scale
		float scaleY = this->getGlobalScale().y;

		float imageWidth = bitmap->width / windowsize.x;
		float imageHeight = bitmap->height / windowsize.y;
	
		float x, y;
		if (i >= 1)
		{
			width += (_queue[i - 1]->width + _queue[i]->width) / 2.0f;
			width += _fontsize*0.05f;
		}
		else
		{

			width += _queue[i]->width / 2.0f;
		}
		if (_queue[i]->_char <= 0xff)
		{
			height = _queue[i]->height / 2.0f + _fontsize*0.08F;
		}
		else
		{
			height = _fontsize / 2.0f;

		}
		height -= _fontsize *0.08;




		// transform position with inner anchor point
		x = (this->getGlobalPosition().x + width - _rect.x*_anchor.x) / windowsize.x * 2.0f
			+ imageWidth - (0.5)*imageWidth * 2.0f;

		y = (this->getGlobalPosition().y + height-_fontsize*_anchor.y*0.71// - (_anchor.y)*height * 2.0f) 
			)/windowsize.y * 2.0f + imageHeight - (0.5)*imageHeight * 2.0f;

		xx += x;
		yy += y;

		//for different image has different Texcoord
		float _coord2f[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };


		//	glPushMatrix();


		// transform the vertexs
		glTexCoord2f(_coord2f[0], _coord2f[1]); glVertex2f(-imageWidth*scaleX + xx, -imageHeight*scaleY + yy);
		glTexCoord2f(_coord2f[2], _coord2f[3]); glVertex2f(imageWidth*scaleX + xx, -imageHeight *scaleY + yy);
		glTexCoord2f(_coord2f[4], _coord2f[5]); glVertex2f(imageWidth*scaleX + xx, imageHeight*scaleY + yy);
		glTexCoord2f(_coord2f[6], _coord2f[7]); glVertex2f(-imageWidth*scaleX + xx, imageHeight*scaleY + yy);



		//glPopMatrix();

		glDisable(GL_BLEND);
		glDisable(GL_ALPHA_TEST);


		glEnd();
	}
	Node::draw();

}
Scroll Up