关于OpenGL 2D纹理贴图的经验总结,

今儿在搞OpenGL想让一个2D图片在win32环境下通过openGL显示出来。

流程大体是这样的。

1.用libpng将一个png图的各种结构读出来,自建的一个CImage类里面。

成员函数包括ImageWidth, ImageHeight, p_imgData.




2.再在Texture2D里面通过自写的一个initWithImage函数,解析这个图片资源。

大约步骤包括

1)解析该图片资源的格式为RGBA8888 or RGB888 or RGB565 ........

2 ) 之后根据不同的格式转换其p_imageData到一个openGL可识别的data数组。

3 ) 通过如下函数GetTextureSize生成一个纹理的宽和高,主要是去掉奇数宽高值

4) 进入openGL初始化步骤

3.OpenGL初始化步骤

    glEnable(GL_TEXTURE_2D);//开启openGL 2D 纹理
	GLint saveName;

	glGenTextures(1, &_name);//告诉OpenGL生成一个纹理ID,注意刚才一直在这吃亏,这个操作必须在wglMakeCurrent之后。否则_name将获得不到ID值
	glBindTexture(GL_TEXTURE_2D, _name);//将该纹理绑定为一个2D纹理

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	

	//printf("mem %d\n",g_totalTextureMem/1024);	
	
	switch(pixelFormat)
	{
		case kTexture2DPixelFormat_RGBA8888:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
			_textureMem = tex_w * tex_h * 4;
		break;
			
		case kTexture2DPixelFormat_RGBA4444:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data);
			_textureMem = tex_w * tex_h * 2;
		break;
			
		case kTexture2DPixelFormat_RGBA5551:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, data);
		break;
			
		case kTexture2DPixelFormat_RGB565:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_w, tex_h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data);
		break;
			
		case kTexture2DPixelFormat_RGB888:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_w, tex_h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
			_textureMem = tex_w * tex_h * 3;
		break;
			
		case kTexture2DPixelFormat_L8:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, tex_w, tex_h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
		break;
			
		case kTexture2DPixelFormat_A8:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tex_w, tex_h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, data);
		break;
			
		case kTexture2DPixelFormat_LA88:
			glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, tex_w, tex_h, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
		break;
			
			
		default:
		break;
	}

	glBindTexture(GL_TEXTURE_2D, saveName);
	
	_img_w = img_w;
	_img_h = img_h;
	_width = tex_w;
	_height = tex_h;
	_format = pixelFormat;

	
	glDisable(GL_TEXTURE_2D);

4.之后这个Texture就绑定了这个纹理了。

     之后在渲染的时候,渲染这个纹理即可,步骤如下。

    创建一个矩形图形,绑定该纹理。

glBindTexture(GL_TEXTURE_2D, m_currentTexture);

之后通过

glVertexPointer(3, GL_SHORT, 0, _buffer_vertex_coord);
glDrawArrays(GL_TRIANGLE_STRIP, 0, total);
将其绘制出来即可。



你可能感兴趣的:(OpenGL编程那点儿事儿)