OpenGL纹理映射总结 |
您所在的位置:网站首页 › opengl纹理大小 › OpenGL纹理映射总结 |
bilinear:二次插值,精度更高,但需要自己动手计算。
对于复杂的物体表面来说逐一指定其纹理坐标是相当烦琐的事,所以OpenGL支持纹理坐标自动生成。可用glTexGen命令开关。详情见手册或联机帮助。 注意:OpenGL1.2还支持GL_TEXTURE_3D,在低版本OpenGL中三维纹理则是一个展扩。 以下代码是展示了完整的贴纹理过程: //----纹理尺寸----------#define TEXW 64#define TEXH 64byte tex[TEXW][TEXH][3];//----生成纹理数据------int i,j;//----定义纹理--------- glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexImage2D(GL_TEXTURE_2D,0,3,TEXW,TEXH,0,GL_RGB,GL_UNSIGNED_BYTE,tex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);//----打开纹理计算----- glEnable(GL_TEXTURE_2D);//----使用纹理---------- glBegin(GL_QUADS); glTexCoord2f(-1,-1); glVertex3f(-1,-1,0); glTexCoord2f(-1,1); glVertex3f(-1,1,0); glTexCoord2f(1,1); glVertex3f(1,1,0); glTexCoord2f(1,-1); glVertex3f(1,-1,0); glEnd();
源文档
OpenGL纹理贴图 纹理映射是将指定图像的一部分映射到允许进行纹理映射的每个图段上。这种映射伴随着使用一幅图像的颜色到某一图段的(s,t,r)坐标所指示的位置上并修改该图段的RGBA颜色。但要特别注意的是,在OpenGL中,纹理映射仅在RGBA模式下说明,在颜色索引模式下,它的使用未作定义。概括地说,使用纹理绘制的一般步骤为:定义纹理贴图、控制纹理、说明纹理贴图方式,定义纹理坐标等。 2.1 定义纹理 纹理的定义有两种:连续法和离散法。连续法把纹理定义为一个二元函数,函数的定义域就是纹理空间。而离散法则是把纹理定义在一个二维数组中,该数组表示纹理空间中行间隔和列间隔固定的一组网格点上的纹理值。网格点之间的其它点的纹理值可以通过对相邻网格点上纹理值进行插值来获得。通过纹理空间与物体空间之间的坐标变换,可以把纹理映射到物体表面。一般来说,离散法是较为常用的纹理定义方法。其实现函数为 glTexlmage2D()。该函数的原型如下:void glTexImage2D(Gl_enum target,GLint level,Gl_enum compo—nents, GLsizei width, GLsizei height, Glint border,Gl_enumformat。Gl_enumtype,const GLvoid pixels);其中:target指定纹理映射,此处必须是GL—TEXT—URE 2D;level指定纹理图像分辨率的级数,当只 有一种分辨率时,level=0;Components是选择用于调整和混合的成分;width和height分别指定纹理图像的宽和高,必须是2 ,凡为正数;Border为边界的宽度,必须是0和1;format和type分别指定纹理映射的格式和数据类型;Pixels指定一个指针,指向纹理数据在内存中的位置。 2.2 控制纹理 纹理图像在映射到物体时会产生许多问题。这些问题主要有纹理图像的纹理怎样对应到屏幕上的像素、怎样通过纹理贴图实现纹理缩放和纹理重复等。其实现函数为glTexParmneter(),该函数的原型(以glTexParmneterf形式为例)为:void glTexPa—rmneterf(GLeRuin target,GLeRuin pname,GLfloat pa—ram),其中target参数为目标纹理,pname参数的取值有以下几个:GL TEXTURE MIN FILTER、GL,ⅡⅨ TURE—MAG一兀I肛R、GL—TEXrrI yRE— WRAP一GL— TEXTU RE —WRAP— T,而parmn参数的取值要根据pname而定。 2.3 说明纹理贴图方式 OpenGL用于纹理贴图方式的函数为glTex~v(),该函数的原型(以glTexEnvf形式为例)为:voidglTexEnv(Gl_enum target,Gl_enum pname,GLfloat pa—ram)其中target参数必须为GL—TEXTURE —ENV,pname参数必须为GL—TEXTURE —ENV—MODE,而参数parmn为GL—MODULATE 、GL—DECAL或GL—BLEND。 2.4 定义纹理坐标 纹理坐标控制纹理图像中的像素怎样映射到物体。纹理坐标可以是1、2、3、4维的,通常用齐次坐标来表示,即(5,t,r,q)。OpenGL定义纹理坐标的函数为 xCoord()。该函数共有32种不同的形式。例如:glTexCoord4f(O.Of,0.Of,0.Of,0.Of)。 3 基于MFC的OpenGL中的纹理贴图利用VC++的MFC AppWizard(exe)建立一个新项目OpenglTexture,选择基于单文档界面的应用,其它选项都使用缺省值。在OpenglTextureView.h头文件中,添加各成员变量和成员函数。 for(i=0;isizeY/2, //图像高 0, //图像边框 GL_RGB, //图像是RGB三色组成 GL_UNSIGNED_BYTE, //图像数据是无符号字节类型 TextureImage[0]->data); //图像数据来源
//采用GL_LINEAR使得纹理从很远处到离屏幕很*时都*滑显示 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); // 线形滤波 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // 线形滤波
return Status; } AUX_RGBImageRec* CMubanView::LoadBMP(char *Filename) { FILE *File=NULL; if (!Filename) //文件名是否存在(判断结果---文件名是存在的) { return NULL; } File=fopen(Filename,"r"); //读取文件 if (File) //文件读取成功 { fclose(File); //关闭文件流 return auxDIBImageLoad(Filename); //载入位图并返回指针 } return NULL; }
源文档 品寒绝顶雪舞人间 OPENGL的纹理 在3D图形中,纹理映射是广泛使用的。纹理映射也是相当复杂的过程: 一 定义纹理 二 控制滤波 三 说明映射方式 四 绘制场景给出顶点的纹理坐标和几何坐标 注意!!纹理映射只能在RGBA模式下使用,不适用于颜色索引模式
1.纹理定义 void glTexImage2D( GLenum 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到4的整数,1:选择R;2:选择R A;3:选择R G B; 4:选择R G B A; width height是纹理的尺寸。 format和type描述映射格式和数据类型。它们与前面讲的glDrawPixels()中 OPENGL的纹理 在3D图形中,纹理映射是广泛使用的。纹理映射也是相当复杂的过程: 一 定义纹理 二 控制滤波 三 说明映射方式 四 绘制场景给出顶点的纹理坐标和几何坐标 注意!!纹理映射只能在RGBA模式下使用,不适用于颜色索引模式
1.纹理定义 void glTexImage2D( GLenum 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到4的整数,1:选择R;2:选择R A;3:选择R G B; 4:选择R G B A; width height是纹理的尺寸。 format和type描述映射格式和数据类型。它们与前面讲的glDrawPixels()中 GL_NEAREST_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR 2.1 滤波 原始纹理图象是个方形图象,把它映射到奇形怪状的物体上,一般不可能图象 上的一个象素对应屏幕的一个象素。因此局部放大缩小时,就要定义合适的滤 波方式(以2D为例): void glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); void glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); 前者是放大滤波(GL_TEXTURE_MAG_FILTER), 后者是缩小滤波(GL_TEXTURE_MIN_FILTER); 另外,GL_NEAREST是利用最坐标最靠*象素中心的纹理元素,这有可能使图样 走型,但计算速度快;GL_LINEAR利用线形插值,效果好但计算量大。
2.2重复与缩限 纹理映射可以重复映射或者缩限映射,重复映射时纹理可以在自己的坐标S T方 向重复。 对于重复映射: void glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); void glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 参数GL_REPEAT改为GL_CLAMP,则缩限,所有大于1的纹理元素值置为1。所有小于 0的纹理元素值置为0。 0的纹理元素值置为0。
3. 映射方式 处理纹理本身图案颜色和物体本身颜色的关系: void glTexEnv{if}[v](GLenum target,GLenum pname,TYPE param); target必须是GL_TEXTURE_ENV;
pname是GL_TEXTURE_ENV_MODE,则param可以是 GL_DECAL GL_MODULATE或 GL_BLEND,说明纹理值与原来颜色不同的处理方式。 pname是GL_TEXTURE_ENV_COLOR,则参数param是包含4个浮点数(R、G、B、A) 的数组。这些值只在采用GL_BLEND纹理函数时才采用。
4. 纹理坐标 坐标的定义:纹理图象是方形的,纹理坐标可定义成s,t,r,q坐标,仿照齐次 坐标系的x,y,z,w坐标。 void glTexCoord{1234}{sifd}[v](TYPE coords); 设置当前纹理坐标,此后调用glVertex*()所产生的顶点都赋予当前的纹理坐标。
5. 坐标自动产生 有时不需要为每个物体顶点赋予纹理坐标,可以使用 void glTexGen{if}(GLenum coord,GLenum pname,TYPE param); coord为:GL_S GL_T GL_R或GL_Q,指明哪个坐标自动产生 pname为GL_TEXTURE_GEN_MODE时 param为常数:GL_OBJECT_LINEAR GL_EYE_LINEAR或GL_SPHERE_MAP,它们决定用 哪个函数来产生纹理坐标
pname为GL_OBJECT_PLANE或GL_EYE_PLANE,param时一个指向参数数组的指针。
先请看一个简单的例子: //////////////////////////////////////////// //sample.cpp #include "glos.h" #include #include #include "windows.h" void myinit(void); void CALLBACK display(void); void CALLBACK reshape(GLsizei w,GLsizei h);
//创建纹理图象的子程序 #define TEXTUREWIDTH 64 #define TEXTUREHEIGHT 64 GLubyte Texture[TEXTUREWIDTH][TEXTUREHEIGHT][3]; void makeTexture(void) void makeTexture(void) { int i,j,r,g,b; for(i=0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |