




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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_2Dlevel表示多级分辨率的纹理图象的级数。若只有一种分辨率,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_2Dlevel表示多级分辨率的纹理图象的级数。若只有一种分辨率,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_NEARESTGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_NEARESTGL_LINEAR_MIPMAP_LINEAR2.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重复与缩限纹理映射可以重复映射或者缩限映射,重复映射时纹理可以在自己的坐标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 glTexEnvifv(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 glTexCoord1234sifdv(TYPE coords);设置当前纹理坐标,此后调用glVertex*()所产生的顶点都赋予当前的纹理坐标。5. 坐标自动产生有时不需要为每个物体顶点赋予纹理坐标,可以使用void glTexGenif(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.hvoid myinit(void);void CALLBACK display(void);void CALLBACK reshape(GLsizei w,GLsizei h);/创建纹理图象的子程序#define TEXTUREWIDTH 64#define TEXTUREHEIGHT 64GLubyte TextureTEXTUREWIDTHTEXTUREHEIGHT3;void makeTexture(void)void makeTexture(void)int i,j,r,g,b;for(i=0;iTEXTUREWIDTH;i+)for(j=0;jTEXTUREHEIGHT;j+)r=(i*j)%255;g=(4*i)%255;b=(4*j)%255;Textureij0 =(GLubyte)r;Textureij1 =(GLubyte)g;Textureij2 =(GLubyte)b;void myinit(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);auxInitPosition(0,0,500,500);auxInitWindow(sample1);auxInitWindow(sample1);glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);/创建纹理图象的原始数据保存在Texture中makeTexture();glPixelStorei(GL_UNPACK_ALIGNMENT,1);/定义二维纹理glTexImage2D(GL_TEXTURE_2D,0,3,TEXTUREWIDTH,TEXTUREHEIGHT,0,GL_RGB,GL_UNSIGNED_BYTE,&Texture000);/控制滤波glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);/说明映射方式glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);/这个应该很熟了,启用纹理模式glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_2D);/ glShadeModel(GL_FLAT);void CALLBACK reshape(GLsizei w,GLsizei h)glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();/定义立体视景体gluPerspective(60.0,1.0*(GLfloat)w/(GLfloat)h,1.0,30.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0,0.0,-3.6);void CALLBACK display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glBegin(GL_QUADS);/绘制四边形/先绘制正方形,用来显示实际未变形的纹理图样/先绘制正方形,用来显示实际未变形的纹理图样glTexCoord2f(0.0,0.0);glVertex3f(-2.0,-1.0,0.0);glTexCoord2f(0.0,1.0);glVertex3f(-2.0,1.0,0.0);glTexCoord2f(1.0,1.0);glVertex3f(0.0,1.0,0.0);glTexCoord2f(1.0,0.0);glVertex3f(0.0,-1.0,0.0);/绘制一个不规则四边形,用来显示纹理是如何随物体形状而变形的。glTexCoord2f(0.0,0.0);glVertex3f(0.0,-1.0,0.0);glTexCoord2f(0.0,1.0);glVertex3f(0.0,1.0,0.0);glTexCoord2f(1.0,1.0);glVertex3f(1.41421,1.0,-1.41421);glTexCoord2f(1.0,0.0);glVertex3f(1.41421,-1.0,-1.41421);glEnd();glFlush();void main(void)myinit();auxReshapeFunc(reshape);auxMainLoop(display);/end of sample从例子来看,除了纹理的定义和控制比较麻烦和不容易理解外,其应用是十分方便的。只须从纹理的坐标系选出合适点附在实际物体顶点上即可。对于复杂的纹理定义和控制,你也可以自行改变一些参数,看看效果如何。例如把GL_LINEAR改成GL_NEAREST,则纹理的明显变的粗糙,但计算结果却快的多。你也可以改动glTexCoord2f()的参数,看看如何选定纹理的一部分(例子中是选定全部纹理)来贴图。例如1.0改成0.5则选择实际纹理的左上1/4部分来贴图。下次将给出一个更复杂的纹理应用的例子和说明。18:03 98-1-21这次将结束纹理的内容。紧接上次,在上次平面纹理贴图中,我们先定义了一个数组(一维或二维.)来定义纹理的数据,所以纹理本身是一个N维空间,有自己的坐标和顶点。在上次的例子中,我们学会了如何把纹理数据中的坐标和屏幕物体坐标相结合,就象把一块布料扯成合适的形状贴在物体表面。而上次唯一没有使用的函数是纹理坐标的自动产生(最后一个给出的函数),它的意义是产生一个环境纹理,所有环境内的物体都赋予此纹理,很象一个特殊光源。/sample.cpp#include glos.h#include #include #include windows.hvoid myinit(void);void CALLBACK display(void);void CALLBACK reshape(GLsizei w,GLsizei h);/定义一个一维纹理的数据,从生成来看,保持红色、兰色分量255(MAX),/所以是渐变的紫色纹理,饱和度不断变化。/所以是渐变的紫色纹理,饱和度不断变化。#define TEXTUREWIDTH 64GLubyte Texture3*TEXTUREWIDTH;void makeTexture(void)int i;for(i=0;iTEXTUREWIDTH;i+)Texture3*i =255;Texture3*i+1 =255-2*i;Texture3*i+2 =255;GLfloat sgenparams=1.0,1.0,1.0,0.0;void myinit(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);auxInitPosition(0,0,500,500);auxInitWindow(sample1);glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);/创建纹理makeTexture();glPixelStorei(GL_UNPACK_ALIGNMENT,1);/控制纹理glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage1D(GL_TEXTURE_1D,0,3,TEXTUREWIDTH,0,GL_RGB,GL_UNSIGNED_BYTE,Texture);/唯一与前面例子不同的地方:启用纹理坐标自动产生,生成环境纹理/纹理的方向SglTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams);/启用纹理glEnable(GL_TEXTURE_1D);glEnable(GL_TEXTURE_GEN_S);/启用消隐glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glDepthFunc(GL_LESS);/一些绘图控制,详细可参阅VC5联机帮助glEnable(GL_CULL_FACE);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);glFrontFace(GL_CW);glCullFace(GL_BACK);glMaterialf(GL_FRONT,GL_SHININESS,64.0);/ glShadeModel(GL_FLAT);void CALLBACK reshape(GLsizei w,GLsizei h)glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w0,缺省1void glLineWidth(GLfoat width);设置线宽,width0,缺省为1void glLineStipple(GLint factor,GLushort pattern);设置线的模式,factor用于对模式进行拉伸的比例因子,pattern是线的模式例如11001100是虚线(1绘制,0不绘制)必须要启用glEnable(GL_LINE_STIPPLE)才能使用以上函数,不再使用时调用glDisable(GL_LINE_STIPPLE)关闭,这与以前的glEnable();glDisable();的用法都是类似的。请看下面例子:/sample.cpp#include glos.h#include glos.h#include #include #include windows.hvoid myinit(void);void CALLBACK display(void);void CALLBACK reshape(GLsizei w,GLsizei h);void myinit(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);auxInitPosition(0,0,600,500);auxInitWindow(sample1);glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glShadeModel(GL_FLAT);void CALLBACK reshape(GLsizei w,GLsizei h)glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w,4.0*(GLfloat)h/(GLfloat)w,-4.0,4.0);else glOrtho(-4.0*(GLfloat)h/(GLfloat)w,4.0*(GLfloat)h/(GLfloat)w,-4.0,4.0,-4.0,4.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/自定义的绘制直线的函数,参数为起始点和终止点坐标void line2i(GLint x1,GLint y1,GLint x2,GLint y2)glBegin(GL_LINES);glVertex2f(x1,y1);glVertex2f(x2,y2);glEnd();glEnd();void CALLBACK display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/首先绘制一系列点,点的大小不断增加int i;glColor3f(0.8,0.6,0.4);for(i=1;i=10;i+)glPointSize(i*2);glBegin(GL_POINTS);glVertex2f(30.0+(GLfloat)i*50.0),330.0);glEnd();/再绘制两条虚线,第二条比第一条松散一些,由pattern参数即可看出glEnable(GL_LINE_STIPPLE);glLineStipple(1,0x0101);/间隔1位glColor3f(1.0,0.0,0.0);line2i(20,250,250,250);glLineStipple(1,0x00ff);/间隔2位glLineStipple(1,0x00ff);/间隔2位glColor3f(0.0,0.0,1.0);line2i(300,250,550,250);/改变线的绘制宽度的效果-加宽/重新画出上面两条虚线glLineWidth(5.0);glEnable(GL_LINE_STIPPLE);glLineStipple(1,0x0101);glColor3f(1.0,0.0,0.0);line2i(50,150,250,150);glLineStipple(1,0x00ff);glColor3f(0.0,0.0,1.0);line2i(300,150,550,150);glFlush();void main(void)myinit();/ auxReshapeFunc(reshape);auxMainLoop(display);auxMainLoop(display);/end of sample2.多边形void glPolygonMode(GLenum face,GLenum mode);控制多边形指定面的绘图模式,face为:GL_FRONT GL_BACK或GL_FRONT_AND BACKmode为:GL_POINT GL_LINE或GL_FILL表示多边型的轮廓点、轮廓线和填充模式的绘制方式。缺省是填充方式。void glPolygonStipple(const GLubyte *mask);其中mask必须是指向32*32的位图指针,1是绘制、0不绘制使用上述函数也要调用:glEnable(GL_POLYGON-STIPPLE);glDisable(GL_POLYGON_STIPPLE);请看下面例子:/sample.cpp#include glos.h#include #include #include #include windows.hvoid myinit(void);void CALLBACK display(void);void CALLBACK reshape(GLsizei w,GLsizei h);/定义填充模式32*32点阵GLubyte pattern=0x00,0x01,0x80,0x00,0x00,0x03,0xc0,0x00,0x00,0x07,0xe0,0x00,0x00,0x0f,0xf0,0x00,0x00,0x1f,0xf8,0x00,0x00,0x3f,0xfc,0x00,0x00,0x7f,0xfe,0x00,0x00,0xff,0xff,0x00,0x01,0xff,0xff,0x80,0x03,0xff,0xff,0xc0,0x07,0xff,0xff,0xe0,0x0f,0xff,0xff,0xf0,0x1f,0xff,0xff,0xf8,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xfc,0x7f,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xfc,0x1f,0xff,0xff,0xf8,0x0f,0xff,0xff,0xf0,0x07,0xff,0xff,0xe0,0x03,0xff,0xff,0xc0,0x01,0xff,0xff,0x80,0x00,0xff,0xff,0x00,0x00,0x7f,0xfe,0x00,0x00,0x3f,0xfc,0x00,0x00,0x1f,0xf8,0x00,0x00,0x0f,0xf0,0x00,0x00,0x07,0xe0,0x00,0x00,0x03,0xc0,0x00,0x00,0x01,0x80,0x00;void myinit(void)void myinit(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);auxInitPosition(0,0,400,400);auxInitWindow(sample1);glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glShadeModel(GL_FLAT);void CALLBACK reshape(GLsizei w,GLsizei h)glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h) glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w,4.0*(GLfloat)h/(GLfloat)w,-4.0,4.0);else glOrtho
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新材料科学与工程考试试卷及答案
- 外科术后引流管的护理
- 2025年社会心理学基础知识考试试卷及答案
- 2025年旅游策划与管理专业考试试题及答案
- 2025年计算机等级考试综合能力试卷及答案
- 2025年海洋科学与技术基础知识测试试题及答案
- 2025年机器人技术与应用能力测试试题及答案
- 2025年中医药学基础知识与实践考试试题及答案
- 2025年电子信息工程专业毕业设计答辩试题及答案
- 农产品溯源升级2025年农产品质量安全追溯体系建设实施方案标准制定研究
- 单体药店GSP质量管理制度
- 2025年江苏省高考化学试卷真题
- (网络+收集版)2025年高考全国二卷语文高考真题文档版(无答案)
- 室内妇科诊室管理制度
- 2025年现代图书馆管理与信息服务考试试题及答案
- 2025年高等教育心理学考试试卷及答案
- 2025年河北省中考二模道德与法治试题(启光卷含答案)
- 材料力学知到智慧树期末考试答案题库2025年辽宁工程技术大学
- 敦煌文化介绍课件
- 2025贵州中考:历史必考知识点
- 国家开放大学2025年《创业基础》形考任务4答案
评论
0/150
提交评论