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

本文详细介绍了如何使用OpenGL在Win32环境下加载并渲染2D图片。从读取PNG文件开始,通过转换图像数据格式使其符合OpenGL的要求,最终实现纹理绑定及绘制过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://blog.youkuaiyun.com/devfun/article/details/6757500


今儿在搞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初始化步骤

[cpp]  view plain copy
  1.    glEnable(GL_TEXTURE_2D);//开启openGL 2D 纹理  
  2. GLint saveName;  
  3.   
  4. glGenTextures(1, &_name);//告诉OpenGL生成一个纹理ID,注意刚才一直在这吃亏,这个操作必须在wglMakeCurrent之后。否则_name将获得不到ID值  
  5. glBindTexture(GL_TEXTURE_2D, _name);//将该纹理绑定为一个2D纹理  
  6.   
  7. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  
  8. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  
  9. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);  
  10. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);  
  11.   
  12.   
  13. //printf("mem %d\n",g_totalTextureMem/1024);      
  14.   
  15. switch(pixelFormat)  
  16. {  
  17.     case kTexture2DPixelFormat_RGBA8888:  
  18.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);  
  19.         _textureMem = tex_w * tex_h * 4;  
  20.     break;  
  21.           
  22.     case kTexture2DPixelFormat_RGBA4444:  
  23.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data);  
  24.         _textureMem = tex_w * tex_h * 2;  
  25.     break;  
  26.           
  27.     case kTexture2DPixelFormat_RGBA5551:  
  28.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, data);  
  29.     break;  
  30.           
  31.     case kTexture2DPixelFormat_RGB565:  
  32.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_w, tex_h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data);  
  33.     break;  
  34.           
  35.     case kTexture2DPixelFormat_RGB888:  
  36.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_w, tex_h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);  
  37.         _textureMem = tex_w * tex_h * 3;  
  38.     break;  
  39.           
  40.     case kTexture2DPixelFormat_L8:  
  41.         glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, tex_w, tex_h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);  
  42.     break;  
  43.           
  44.     case kTexture2DPixelFormat_A8:  
  45.         glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tex_w, tex_h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, data);  
  46.     break;  
  47.           
  48.     case kTexture2DPixelFormat_LA88:  
  49.         glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, tex_w, tex_h, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);  
  50.     break;  
  51.           
  52.           
  53.     default:  
  54.     break;  
  55. }  
  56.   
  57. glBindTexture(GL_TEXTURE_2D, saveName);  
  58.   
  59. _img_w = img_w;  
  60. _img_h = img_h;  
  61. _width = tex_w;  
  62. _height = tex_h;  
  63. _format = pixelFormat;  
  64.   
  65.   
  66. glDisable(GL_TEXTURE_2D);  

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

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

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

[cpp]  view plain copy
  1. glBindTexture(GL_TEXTURE_2D, m_currentTexture);  

之后通过

[cpp]  view plain copy
  1. glVertexPointer(3, GL_SHORT, 0, _buffer_vertex_coord);  
  2. glDrawArrays(GL_TRIANGLE_STRIP, 0, total);  
将其绘制出来即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值