1. 程式人生 > >opengles繪製點精靈

opengles繪製點精靈

什麼是點精靈

opengl圖形由頂點構成,所謂點精靈就是對點進行紋理對映,簡單說就是把一副紋理貼在一個點上

原來4個頂點構成一個矩形,現在一個頂點就完成了,典型的如粒子效果,雲霧,水流火花都可以用點精靈來實現

,這樣減少了3個頂點的計算,效率很高。下面看例子 我們把 這個圖片貼到4個頂點上面


shader實現

	virtual void    initialize()
	{
		//gl_PointSize 表示點的大小
		const char* vs =
		{
			"precision  lowp float;\n"
			"uniform    mat4    _MVP;\n"
			"uniform    float   _pointSize;\n"
			"attribute  vec2    _position;\n"
			"attribute  vec4    _color;\n"
			"varying    vec4    _outColor;\n"
			"void main()\n"
			"{"
			"   vec4    pos =   vec4(_position,0,1);\n"
			"   _outColor   =   _color;\n"
			"   gl_Position =   _MVP * pos;\n"
			"   gl_PointSize=   _pointSize;\n"
			"}"
		};

		//gl_PointCoord 點精靈的二維空間座標範圍在(0.0,0.0)到(1.0,1.0)之間,僅用於點圖元和點精靈開啟的情況下
		const char* ps =
		{
			"precision lowp float;\n"
			"uniform    sampler2D   _texture;\n"
			"varying    vec4        _outColor;\n"
			"void main()\n"
			"{\n"
			"   vec4    texColor=   texture2D( _texture, gl_PointCoord );\n"
			"   gl_FragColor    =   _outColor * texColor;"
			"}"
		};

渲染函式:
		virtual void    render()
		{

			struct  Vertex
			{
				CELL::float2    pos;
				CELL::Rgba4Byte color;
			};
			//! 清空緩衝區
			glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
			//! 視口,在Windows視窗指定的位置和大小上繪製OpenGL內容
			glViewport(0, 0, _width, _height);

			//! 建立一個投影矩陣

			CELL::matrix4   screenProj = CELL::ortho<float>(0, float(_width), float(_height), 0, -100.0f, 100);
			_shader.begin();
			{
				float   x = 100;
				float   y = 100;
				float   w = 300;
				float   h = 300;
				Vertex  vertex[] =
				{
					CELL::float2(x, y), CELL::Rgba4Byte(255, 0, 0, 255),
					CELL::float2(x + w, y), CELL::Rgba4Byte(0, 255, 0, 255),
					CELL::float2(x, y + h), CELL::Rgba4Byte(0, 0, 255, 255),
					CELL::float2(x + w, y + h), CELL::Rgba4Byte(255, 255, 255, 255),
				};

				glBindTexture(GL_TEXTURE_2D, _sprit);
				glUniform1i(_shader._texture, 0);
				glUniform1f(_shader._pointSize, 64);
				glUniformMatrix4fv(_shader._MVP, 1, false, screenProj.data());
				glVertexAttribPointer(_shader._position, 2, GL_FLOAT, false, sizeof(Vertex), vertex);
				glVertexAttribPointer(_shader._color, 4, GL_UNSIGNED_BYTE, true, sizeof(Vertex), &vertex[0].color);
				glDrawArrays(GL_POINTS, 0, 4);
			}
			_shader.end();

		}


完整專案下載地址:http://download.csdn.net/detail/hb707934728/9845362