📄 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 + -