⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opengl+

📁 OpenGl纹理的基本知识 适合于初学者
💻
字号:
OpenGL纹理帖图简介2008/05/07 16:47OpenGL可以生成各种物体,并可以赋予材质和对物体进行光照。但物体表面过于光滑和单调,看起来反而不真实。这是因为现实世界中的物体表面往往有各种纹理,即表面细节。纹理贴图技术也叫纹理映射技术。纹理分两种:颜色纹理,通过颜色色彩或明暗的变化表现出来的表面细节;由于不规则的细小凹凸造成的纹理,如桔子的皱纹和未磨光的凹痕等. 


生成纹理的一般方法是在一个平面区域(纹理空间)上预先定义纹理图案,然后建立物体表面空间和 


纹理图案坐标之间的映射关系。当物体表面的可见的点确定后,就可以根据纹理空间的对应点的值纹理图案,附到物体的表面上。 


纹理的定义有连续法和离散法两种:连续法把纹理定义为一个离散函数,函数的定义域就是纹理空间。 


离散法把纹理函数定义在一个二维数组中,代表纹理空间中行间隔和列间隔固定的一组网格点上的纹理值。网格点之间的其他点的纹理值通过插值获得。通过纹理空间与物体空间的坐标变化,把纹理贴图道物体表面。 


纹理贴图的类型主要有:材质贴图、Mip贴图、凹凸贴图、动态材质贴图等。材质贴图将一张已有的 


图像直接贴到物体的表面;Mip贴图依据不同的精度要求,使用不同版本的材质图样进行贴图;凹凸贴图将深度的变化保存在一张贴图中,然后将对三维物体进行混合贴图处理,最后生成具有凹凸感的贴图效果。 


新的纹理贴图技术包括:双线性过滤技术,可以解决纹理缩放时的块状图;多重贴图技术,可以解决景 


深锯齿问题。景深锯齿现象是当一个物体远离视点时,贴在越来越小的物体上的图案也会被逐渐压缩,以致最后产生视觉余象,这些视觉余象会在动画中引起闪烁现象;三线性过滤技术,解决物体向远处移动且进行图像切换时产生的闪烁现象。 


执行纹理贴图的步骤如下:定义纹理贴图;控制纹理;说明纹理贴图方式;定义纹理坐标。定义二维 


纹理贴图的函数原形 


void glTexImage2D(GLeum target,GLint level,GLint components,GLsizei width, 


GLsizei height,GLint border,GLenum format,GLenum type, 


const GLvoid *pixels); 


target参数必须是GL_TEXTURE_2D; 


level参数表示纹理图像纹理分辨率的级别,当只有一种分辨率时,level值为0; 


components可以为1,2,3,4,1代表只选择纹理图像的红色分量,2代表只选择纹理图像的红色和Alpha分量,3代表同时选择纹理图像的红色、绿色、蓝色分量,4代表同时选择纹理图像的红色、绿色、蓝色和Alpha分量; width和height参量定义纹理图像的宽度和长度,border参数说明纹理边界的宽度; 


format参数说明纹理图像数据的格式,pixels说明纹理图像的像素数据的存储地址; 


定义一维纹理贴图的函数原形为: 


void glTexImage1D(GLenum target,GLint level,GLint components,GLsizei width, 


GLsizei height,GLint border,GLenum format,GLenum typeOpenGL) 


用glTexParameter()解决以下问题:如何将纹理图像的纹理对应到屏幕上的像素;当纹理图像较大或较小时,怎样通过纹理贴图实现纹理缩限和纹理重复。 


void glTexParameter(GLenum target,GLenum pname,GLfloat param); 


target 的参数可以为GL_TEXTURE_1D和GL_TEXTURE_2D; 


pname 的参数可以为 


       常   量 

         含    义 

 
GL_TEXTURE_MIN_FILTER 

 一个像素对应多个纹素 

 
GL_TEXTURE_MAG_FILTER 

 多个像素对应一个纹素 

 
GL_TEXTURE_WRAP_S 

 设置纹理在s方向上的被控行为 

 
GL_TEXTURE_WRAP_T 

 设置纹理在t方向上的被控行为 

 
GL_TEXTURE_BORDER_COLOR 

 设置边界颜色 

 




在进行纹理贴图时,纹理贴图可以直接贴到物体上从而覆盖物体已有的颜色,也可以和物体原有的颜色进行融合。融合是一种重要的图像处理技术,主要用于透明效果的处理。 


     void glTexEnvf(GLenum target,GLenum pname,GLfloat param); 


     target的参数必须是GL_TEXTURE_ENV; 


     pname的参数可以为GL_TEXTURE_ENV_MODE或GL_TEXTURE_ENV_COLOR 


     param可以为GL_MODULATE、GL_DECAL、GL_BLEND 


纹理坐标控制纹理图像中的纹理怎样映射到物体,可以为1,2,3,4维的,通常用齐次坐标表示为 


(s,t,r,q);OpenGL中定义纹理坐标的函数为glTexCoord(),该函数有多种形式,如 


     glTexCoord2f(0.0f,0.0f); 


位图分为设备相关位图和设备无关位图。设备相关位图依赖于显示设备的位模式;设备无关位图描述了 


图形的真实外形,而不是由某种特定显示设备所显示图像的内部表示 


BITMAPFILEHEADER结构 


     typedef struct tagBITMAPFILEHEADER 


     { 


         WORD bfType;//说明文件是一个位图文件 


         WORD bfSize; 


         WORD     bfReserved1; 


         WORD     bfReserved2; 


         DWORD    bfOffBits;//位图文件中的字节偏移 


}BITMAPFILEHEADER; BITMAPINFOHEADER结构 


     typedef struct tagBITMAPINFOHEADER 


     { 


         DWORD    biSize;       //表示结构的大小 


         DWORD    biWidth;      //表示像素为单位的位图宽度 


         DWORD    biHeight;     //表示像素为单位的位图高度 


         WORD     biPlaes;      //表示目标设备的位平面数 


         WORD     biBitCount;   //表示位图的每个像素的位数 


         DWORD    biCompression;     //表示位图的被压缩类型 


         DWORD    biSizeImage; //表示被压缩位图的字节数 


         DWORD    biXPelsPerMeter;   //表示位图的水平分辨率 


         DWORD    biYPelsPerMeter;   //表示位图的垂直分辨率 


         DWORD    biClrUsed;    //指定位图实际使用的颜色数 


         DWORD    biClrImportant;    //位图比较重要的颜色索引的个数 


     }BITMAPINFOHEADER; 


RGBQUAD结构 


     typedef struct tagRGBQUAD 


     { 


         BYTE rgbBLUE;      //蓝色分量 


         BYTE rgbGREEN;      //绿色分量 


         BYTE rgbRED;       //红色分量 


         BYTE rgbReserved; //值为0 


     }RGBQUAD;
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -