OpenGL之纹理贴图(2):Texture Objects

原创 2004年10月05日 14:49:00

在《OpenGL之纹理贴图(2):Basic》中我们了解了一些关于纹理贴图的基础知识。在随后的学习中,我又意识到这样的问题:如何在不同纹理之间自由的切换,即如何给不同的物体映射不同的纹理。在OpenGL 1.1中引入的新特性Texture Objects可以很好的解决这个问题。
Texture Object的主要思想是用Texture Object来维护某些纹理状态,在渲染阶段将Texture Object和某个Texture Target(OpenGL维护三个Texture Target:GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D)绑定,此过程就相当于将此Texture Object维护的纹理状态选入到OpenGL状态机中,这样此Texture Object维护的状态才会起作用。
Texture Object维护的某些纹理状态包括:
   Texture image(s); //纹理图案
   Texture Parameter; //由glTexParameter*()函数控制的参数
注意:其他的纹理相关的状态,如Texture Environment和Texture coordinate generation mode并不包含在Texture Objects中。
每个Texture Object的标识符是用一个unsigned int值来表示的,为了确保每个Texture Object的“名字“是唯一的,OpenGL提供了glGenTexture()函数。每个Texture Object在创建的时候,需要调用glBindTexture()将Texture Object和Texture Target(GL_TEXTURE_1D, GL_TEXTURE_2D)连接起来,在使用Texture Object阶段,仍然需要调用glBindTexture()来"激活"此Texture Object.下面用代码演示如何使用Texture Object:
1.创建一个Texture Object:
  GLuint uiTextureID;
  glGenTexture( 1, &uiTextureID ); //第一个参数指定表明获取多少个连续的纹理标识符
  glBindTexture( GL_TEXTURE_2D, uiTextureID ); //
2.设置此Texture Object维护的纹理状态:
  LoadBMPff( "Texture.bmp" ); //实际上调用的是glTexImage2D(),指定Texture Image
  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
3.重复以上的步骤,可以创建多个Texture Object.
4.在渲染阶段,指定纹理标识符,激活特定Texture Object:
  glClear(GL_COLOR_BUFFER_BIT);
  glEnable(GL_TEXTURE_2D);
  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
  glPushMatrix();
  glBegin(GL_QUADS);
    glBindTexture(GL_TEXTURE_2D,uiTextureID);  
    glTexCoord2f(0.0,0.0);glVertex2f(-1.0,-1.0);
    glTexCoord2f(0.0,1.0);glVertex2f(-1.0,1.0);
    glTexCoord2f(1.0,1.0);glVertex2f(1.0,1.0);
    glTexCoord2f(1.0,0.0);glVertex2f(1.0,-1.0);
  glEnd();
5.不需要时,删除Texture Object:
  glDeleteTextures(1,&uiTextureID);
6.使用完毕.

参考文献:
1.http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node87.html
2.http://www.opengl.org/resources/tutorials/sig99/advanced99/notes/node59.html

-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------

此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: jerrydong@tom.com

----------------------------------------------------------------------------------------

Android4.0 SurfaceTexture

source link: http://developer.android.com/reference/android/graphics/SurfaceTexture.html public...
  • zsc09_leaf
  • zsc09_leaf
  • 2013年12月24日 15:00
  • 14142

OpenGL 纹理本质

几个月前调试3D纹理时发现一个有趣的问题:同样的3D HW lib库在android2.2系统上可以正常工作,但在2.3系统上却不能工作,显示的图像白屏,调试了几天才将问题定位并解决,解决方法很简单:...
  • andyhuabing
  • andyhuabing
  • 2012年07月16日 12:04
  • 8238

OpenGL--纹理贴图基础

理论基础 纹理贴图:通俗地讲就是可以把我们读取的纹理加载到图元表面的一种技术,这样大大的提高了图像的表现质量。实例代码 //读取tga格式图片/*tga图片头信息结构*/ #pragma pack...
  • u010223072
  • u010223072
  • 2015年04月18日 17:07
  • 2363

[OpenGL]图形学之旅:纹理贴图三部曲

下面开始介绍一下OpenGL中的纹理贴图,具体分以下三步: 0.声明存储贴图的相关数据: #define MAXTEXTURE 1 GLuint te...
  • wxg694175346
  • wxg694175346
  • 2012年12月11日 18:53
  • 7031

OpenGL导入贴图的Texture类

  • 2010年04月02日 20:28
  • 4KB
  • 下载

android ndk调用OpenGL 实现纹理贴图Texture

  • 2014年06月25日 05:42
  • 1.49MB
  • 下载

IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)

在这篇文章中,我们将学习如何在openGL中使用纹理贴图。 OpenGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类。由于本文将以一张图片为例,因此我们为我们的纹理...
  • u011240067
  • u011240067
  • 2016年10月25日 19:30
  • 2517

OpenGL ES入门05-OpenGL ES 纹理贴图

前言 本文是关于OpenGL ES的系统性学习过程,记录了自己在学习OpenGL ES时的收获。 这篇文章的目标是学习OpenGL ES 2.0中的纹理贴图技术。 环境是Xcode8.1+O...
  • Mr_zhangrmwork
  • Mr_zhangrmwork
  • 2017年05月10日 09:47
  • 215

OpenGL立方体贴图

OpenGL 立方贴图Copyright NVIDIA Corporation, 1999.Commercial publication in written, electronic, or othe...
  • Crazyjumper
  • Crazyjumper
  • 2007年09月28日 16:13
  • 9884

OpenGL中的贴图方式

http://apps.hi.baidu.com/share/detail/54807724 OpenGL为我们提供了三种纹理——GL_TEXTURE_1D、GL_TEXTURE_2D和GL_TEX...
  • abcdef8c
  • abcdef8c
  • 2012年03月02日 15:16
  • 13937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL之纹理贴图(2):Texture Objects
举报原因:
原因补充:

(最多只允许输入30个字)