OPENGL的纹理.doc

上传人:hs****ma 文档编号:551345886 上传时间:2023-11-25 格式:DOC 页数:14 大小:58.51KB
返回 下载 相关 举报
OPENGL的纹理.doc_第1页
第1页 / 共14页
OPENGL的纹理.doc_第2页
第2页 / 共14页
OPENGL的纹理.doc_第3页
第3页 / 共14页
OPENGL的纹理.doc_第4页
第4页 / 共14页
OPENGL的纹理.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《OPENGL的纹理.doc》由会员分享,可在线阅读,更多相关《OPENGL的纹理.doc(14页珍藏版)》请在金锄头文库上搜索。

1、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_

2、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 glTexImage2

3、D( 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

4、描述映射格式和数据类型。它们与前面讲的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 glTexParamet

5、er(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_R

6、EPEAT);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_MODUL

7、ATE或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(GLen

8、um 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 my

9、init(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)%2

10、55;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);/创建纹理图象的原始数据保

11、存在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);glTexParameter

12、f(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

13、 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);/绘制

14、四边形/先绘制正方形,用来显示实际未变形的纹理图样/先绘制正方形,用来显示实际未变形的纹理图样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);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号