OpenGL之纹理映射

1.1 Texture Mapping

1.1.1 在OpenGL编程中,应用纹理主要分为四步:

  • 创建纹理对象,并为它装载一个纹理;
glGenTexture(1,&texName);				//为每个纹理编号,1代表生成一个编号
glBindTexture(GL_TEXTURE_2D,texName);	//绑定纹理,将会对绑定的纹理进行操作;
glTexImage2D(...);						//装载纹理,从内存载入显存;

glDeleteTextures(GLsizei n,const GLuint *textures);
  • 确定纹理如何应用到每个像素上;
glTexEnvf(GLenum target,GLenum pname,GLfloat param);
/*
	target 必须是GL_TEXTURE_ENV;
	pname必须是GL_TEXTURE_ENV_MODE;
	param 可以为:GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE;纹理应用到每个像素的方式,就是在片元处理阶段是相乘、混合还是替代;
*/
  • 启用纹理贴图功能;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texName);
  • 绘制场景,提供纹理坐标和几何图形坐标;
glTexCoord2f(...);

/*
	纹理坐标范围是[0,1]之间,如果出现超出范围的情况,可以设置纹理的wrap方式;
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); //设置S方向REPEAT,即重复;
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); //设置T方向CLAP,即截断;
*/
glVertex3f(...);

1.1.2 纹理的几何变换

glMatrixMode(GL_TEXTURE);
glTranslate(x,y,z);
glRotatef(angle,x,y,z);
glScalef(sx,sy,sz);
glMatrixMode(GL_MODELVIEW);
  • 常见的应用是实现流动水面的效果;

1.1.3 一维纹理与三维纹理

  • glTexImage1D
  • glTexImage3D

1.2 在图形流水线中,纹理映射为:

  • 在顶点处理阶段,给定顶点的纹理坐标;
  • 光栅化阶段:插值得到每个片元的纹理坐标;
  • 在片元处理阶段,根据纹理坐标获取片元的纹理值;

1.2.1 纹理数据的获取

  • 程序生成;
  • 读取图片文件
  • 拷贝屏幕的部分区域为当前纹理;
glCopyTexImage2D();

OpenGL之纹理映射_第1张图片

  • 替换纹理图像的一部分;
glTexSubImage2D();

OpenGL之纹理映射_第2张图片

  • 拷贝屏幕并替换当前纹理的一部分区域;
glCopyTexSubImage2D();

OpenGL之纹理映射_第3张图片

  • 使用帧缓冲区对象直接渲染到纹理;

1.2.2 BMP、JPEG等图像文件中不包含透明度信息,而TGA文件可以携带透明度信息,还具有压缩格式和非压缩格式两种存储方式。另外,png、dds等也可以携带透明通道信息。

你可能感兴趣的:(OpenGL,图形渲染,OpenGL)