纹理映射
专业术语
纹理映射(Texture Mapping),又称纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。简单来说,就是把一幅图像贴到三维物体的表面上来增强真实感,可以和光照计算、图像混合等技术结合起来形成许多非常漂亮的效果。
简介
纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。
在三维图形中,纹理映射(Texture Mapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许OpenGL硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。
纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,OpenGL提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。这允许OpenGL硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。
实现步骤
使用纹理对象的步骤如下:
第一步:定义纹理对象
const int TexNumber4;
GLuint mes_Texture[TexNumber]; //定义纹理对象数组
第二步:生成纹理对象数组
glGenTextures(TexNumber,m_Texture);
第三步:通过使用glBindTexture选择纹理对象,来完成该纹理对象的定义。
glBindTexture(GL_TEXTURE 2D,m_Texture[0]);
glTexImage2D(GL_TEXTURE_2D,0,3,mes_Texmapl.GetWidth(),mee_Texmapl.GetHeight(),0,GL_BGR_EXT,GL_UNSIGNED_BYTE,mse_Texmapl.GetDibBitsl'trQ);
第四步:在绘制景物之前通过glBindTexture,为该景物加载相应的纹理。
glBindTexture(GLes_TEXTURE_2D,mse_Texture[0]);
第五步:在程序结束之前调用glDeleteTextures删除纹理对象。
glDeleteTextures(TexNumber, mee_Texture);
这样就完成了全部纹理对象的管理和使用。
二维纹理映射
二维纹理映射就是从二维纹理平面到三维物体表面的映射。一般二维纹理平面是有范围限制的,在这个平面区域内, 每点都可用数学函数表达,从而可以离散的分离出每点的灰度值和颜色值,这个平面区域称为纹理空间,一般将纹理空间的平面区域定义在[0, 1] * [0, 1]。
两步法纹理建模
1986年, Bier和Sloan提出了一种独立于物体表面的纹理影射技术, 将纹理空间到物体空间的映射分为两个简单的映射复合。 两步法纹理映射的核心是引进一个包围物体的中介三维曲面作为中间映射媒体, 主要过程分两步:
(a). 将二维纹理映射到一个简单的三维物体表面,如平面球面,圆柱面,立方体表面,采用不同的中间映射媒体生成的纹理效果是不同的, 要根据目标物体表面来选择。
S : (u, v) -->(x', y', z') --- S-映射
如半径为R的球的S-映射为:
x = R * cos a * sin b
y = R * sin a * sin b
z = R * cos b
(0<= a <= 2PI, 0<= b<= PI)
(b). 将(a)的三维物体表面上的纹理映射到目标物体表面
O : (x', y', z') -->(x, y, z) --- O-映射
参考资料
最新修订时间:2024-10-23 09:05
目录
概述
简介
参考资料