




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
opengl纹理 目 录12.1 基本步骤12.2 纹理定义12.3 纹理控制12.4 映射方式12.5 纹理坐标 在三维图形中,纹理映射(texture mapping)的方法运用得很广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,则墙上的每一块砖都必须作为一个独立的多边形来画。另外,纹理映射能够保证在变换多边形时,多边形上的纹理图案也随之变化。例如,以透视投影方式观察墙面时,离视点远的砖块的尺寸就会缩小,而离视点 较近的就会大些。此外,纹理映射也常常运用在其他一些领域,如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或用大理石、木材、布匹等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理映射有许多种情况。例如,任意一块纹理可以映射到平面或曲面上,且对光亮的物体进行纹理映射,其表面可以映射出周围环境的景象;纹理还可按不同的方式映射到曲面上,一是可以直接画上去(或称移画印花法),二是可以调整曲面颜色或把纹理颜色与曲面颜色混合;纹理不仅可以是二维的,也可以是一维或其它维的。本章将详细介绍opengl纹理映射有关的内容:基本步骤、纹理定义、纹理控制、映射方式和纹理坐标等。12.1 基本步骤纹理映射是一个相当复杂的过程,这节只简单地叙述一下最基本的执行纹理映射所需的步骤。基本步骤如下:1)定义纹理、2)控制滤波、3)说明映射方式、4)绘制场景,给出顶点的纹理坐标和几何坐标。注意:纹理映射只能在rgba方式下执行,不能运用于颜色表方式。下面举出一个最简单的纹理映射应用例子:例12-1 简单纹理映射应用例程(texsmpl.c) #include glos.h#include #include #include void myinit(void);void makeimage(void);void callback myreshape(glsizei w, glsizei h);void callback display(void);/* 创建纹理 */#define imagewidth 64#define imageheight 64glubyte imageimagewidthimageheight3;void makeimage(void) int i, j, r,g,b; for (i = 0; i imagewidth; i+) for (j = 0; j imageheight; j+) r=(i*j)%255; g=(4*i)%255; b=(4*j)%255; imageij0 = (glubyte) r; imageij1 = (glubyte) g; imageij2 = (glubyte) b; void myinit(void) glclearcolor (0.0, 0.0, 0.0, 0.0); glenable(gl_depth_test); gldepthfunc(gl_less); makeimage(); glpixelstorei(gl_unpack_alignment, 1); /* 定义纹理 */ glteximage2d(gl_texture_2d, 0, 3, imagewidth, imageheight, 0, gl_rgb, gl_unsigned_byte, &image000); /* 控制滤波 */ 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_nearest); gltexparameterf(gl_texture_2d, gl_texture_min_filter, gl_nearest); /* 说明映射方式*/ gltexenvf(gl_texture_env, gl_texture_env_mode, gl_decal); /* 启动纹理映射 */ glenable(gl_texture_2d); glshademodel(gl_flat);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(1.0, -1.0, 0.0); gltexcoord2f(0.0, 1.0); glvertex3f(1.0, 1.0, 0.0); gltexcoord2f(1.0, 1.0); glvertex3f(2.41421, 1.0, -1.41421); gltexcoord2f(1.0, 0.0); glvertex3f(2.41421, -1.0, -1.41421); glend(); glflush();void callback myreshape(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 main(void) auxinitdisplaymode (aux_single | aux_rgba); auxinitposition (0, 0, 500, 500); auxinitwindow (simple texture map); myinit(); auxreshapefunc (myreshape); auxmainloop(display);图12-1 简单纹理映射以上程序运行结果是将一块纹理映射到两个正方形上去。这两个正方形都是按透视投影方式绘制,其中一个正对观察者,另一个向后倾斜45度角。图形的纹理是由函数makeimage()产生的,并且所有纹理映射的初始化工作都在程序myinit()中进行。由glteximage2d()说明了一个全分辨率的图像,其参数指出了图像的尺寸、图像类型、图像位置和图像的其它特性;下面连续调用函数gltexparameter*()说明纹理怎样缠绕物体和当象素与纹理数组中的单个元素(texel,暂称纹素)不能精确匹配时如何过滤颜色;接着用函数gltexenv*()设置画图方式为gl_decal,即多边形完全用纹理图像中的颜色来画,不考虑多边形在未被纹理映射前本身的颜色;最后,调用函数glenable()启动纹理映射。子程序display()画了两个正方形,其中纹理坐标与几何坐标一起说明,gltexcoord*()函数类似于glnormal*()函数,不过它是设置纹理坐标,之后任何顶点都把这个纹理坐标与顶点坐标联系起来,直到再次调用 gltexcoord*()改变当前纹理坐标。12.2、纹理定义12.2.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的整数,指出选择了r、g、b、a中的哪些分量用于调整和混合,1表示选择了r分量,2表示选择了r和a两个分量,3表示选择了r、g、b三个分量,4表示选择了r、g、b、a四个分量。参数width和height给出了纹理图像的长度和宽度,参数border为纹理边界宽度,它通常为0,width和height必须是2m+2b,这里m是整数,长和宽可以有不同的值,b是border的值。纹理映射的最大尺寸依赖于opengl,但它至少必须是使用64x64(若带边界为66x66),若width和height设置为0,则纹理映射有效地关闭。参数format和type描述了纹理映射的格式和数据类型,它们在这里的意义与在函数gldrawpixels()中的意义相同,事实上,纹理数据与gldrawpixels()所用的数据有同样的格式。参数format可以是gl_color_index、gl_rgb、gl_rgba、gl_red、gl_green、gl_blue、gl_alpha、gl_luminance或gl_luminance_alpha(注意:不能用gl_stencil_index和gl_depth_component)。类似地,参数type是gl_bype、gl_unsigned_byte、gl_short、 gl_unsigned_short、gl_int、gl_unsigned_int、gl_float或gl_bitmap。参数pixels包含了纹理图像数据,这个数据描述了纹理图像本身和它的边界。12.2 一维纹理定义的函数void glteximage1d(glenum target,glint level,glint components,glsizei width,glint border,glenum format,glenum type,const glvoid *pixels);定义一个一维纹理映射。除了第一个参数target应设置为gl_texture_1d外,其余所有的参数与函数teximage2d()的一致,不过纹理图像是一维纹素数组,其宽度值必须是2的幂,若有边界则为2m+2。12.3、纹理控制opengl中的纹理控制函数是void gltexparameterifv(glenum target,glenum pname,type param);控制纹素映射到片元(fragment)时怎样对待纹理。第一个参数target可以是gl_texture_1d或gl_texture_2d,它指出是为一维或二维纹理说明参数;后两个参数的可能值见表12-1所示。 参数值gl_texture_wrap_sgl_clampgl_repeatgl_texture_wrap_tgl_clampgl_repeatgl_texture_mag_filter gl_nearestgl_lineargl_texture_min_filter gl_nearestgl_lineargl_nearest_mipmap_nearestgl_nearest_mipmap_lineargl_linear_mipmap_nearestgl_linear_mipmap_linear 表12-1 放大和缩小滤波方式12.3.1 滤波一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕图像上的象素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。下面用函数gltexparameter*()说明放大和缩小的方法: gltexparameter*(gl_texture_2d,gl_texture_mag_filter,gl_nearest);gltexparameter*(gl_texture_2d,gl_texture_min_filter,gl_nearest);实际上,第一个参数可以是gl_texture_1d或gl_texture_2d,即表明所用的纹理是一维的还是二维的;第二个参数指定滤波方法,其中参数值gl_texture_mag_filter指定为放大滤波方法,gl_texture_min_filter指定为缩小滤波方法;第三个参数说明滤波方式,其值见表12-1所示。若选择gl_nearest则采用坐标最靠近象素中心的纹素,这有可能使图像走样;若选择gl_linear则采用最靠近象素中心的四个象素的加权平均值。gl_nearest所需计算比gl_linear要少,因而执行得更快,但gl_linear提供了比较光滑的效果。12.3.2 重复与约简纹理坐标可以超出(0, 1)范围,并且在纹理映射过程中可以重复映射或约简映射。在重复映射的情况下,纹理可以在s,t方向上重复,即:gltexparameterfv(gl_texture_2d,gl_texture_wrap_s,gl_repeat);gltexparameterfv(gl_texture_2d,gl_texture_wrap_t,gl_repeat);若将参数gl_repeat改为gl_clamp,则所有大于1的纹素值都置为1,所有小于0的值都置为0。参数设置参见表12-1。12.4、映射方式在本章的第一个例程中,纹理图像是直接作为画到多边形上的颜色。实际上,可以用纹理中的值来调整多边形(曲面)原来的颜色,或用纹理图像中的颜色与多边形(曲面)原来的颜色进行混合。因此,opengl提供了三种纹理映射的方式,这个函数是: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是包含四个浮点数(分别是r、g、b、a分量)的数组,这些值只在采用gl_blend纹理函数时才有用。12.5、纹理坐标12.5.1 坐标定义在绘制纹理映射场景时,不仅要给每个顶点定义几何坐标,而且也要定义纹理坐标。经过多种变换后,几何坐标决定顶点在屏幕上绘制的位置,而纹理坐标决定纹理图像中的哪一个纹素赋予该顶点。并且顶点之间的纹理坐标插值与基础篇中所讲的平滑着色插值方法相同。纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,称为s,t,r和q坐标,以区别于物体坐标(x, y, z, w)和其他坐标。一维纹理常用s坐标表示,二维纹理常用(s, t)坐标表示,目前忽略r坐标,q坐标象w一样,一半值为1,主要用于建立齐次坐标。opengl坐标定义的函数是:void gltexcoord1234sifdv(type coords);设置当前纹理坐标,此后调用glvertex*()所产生的顶点都赋予当前的纹理坐标。对于gltexcoord1*(),s坐标被设置成给定值,t和r设置为0,q设置为1;用gltexcoord2*()可以设置s和t坐标值,r设置为0,q设置为1;对于gltexcoord3*(),q设置为1,其它坐标按给定值设置;用gltexcoord4*()可以给定所有的坐标。使用适当的后缀(s,i,f或d)和type的相应值(glshort、glint、glfloat或gldouble)来说明坐标的类型。注意:整型纹理坐标可以直接应用,而不是象普通坐标那样被映射到-1, 1之间。12.5.2 坐标自动产生在某些场合(环境映射等)下,为获得特殊效果需要自动产生纹理坐标,并不要求为用函数gltexcoord*()为每个物体顶点赋予纹理坐标值。opengl提供了自动产生纹理坐标的函数,其如下:void gltexgenifv(glenum coord,glenum pname,type param);自动产生纹理坐标。第一个参数必须是gl_s、gl_t、gl_r或gl_q,它指出纹理坐标s,t,r,q中的哪一个要自动产生;第二个参数值为gl_texture_gen_mode、gl_object_plane或 gl_eye_plane;第三个参数param是一个定义纹理产生参数的指针,其值取决于第二个参数pname的设置,当pname为gl_texture_gen_mode时,param是一个常量,即gl_object_linear、gl_eye_linear或gl_sphere_map,它们决定用哪一个函数来产生纹理坐标。对于pname的其它可能值,param是一个指向参数数组的指针。下面是一个运用自动产生纹理坐标函数的实例:例12-1 纹理坐标自动产生例程(texpot.c)#include glos.h#include #include #include void myinit(void);void makestripeimage(void);void callback display(void);void callback myreshape(glsizei w, glsizei h);#define stripeimagewidth 64glubyte stripeimage3*stripeimagewidth;void makestripeimage(void) int j; for (j = 0; j stripeimagewidth; j+) stripeimage3*j = 255; stripeimage3*j+1 =255-2*j; stripeimage3*j+2 =255; /* 参数设置 */glfloat sgenparams = 1.0, 1.0, 1.0, 0.0;void myinit(void) glclearcolor (0.0, 0.0, 0.0, 0.0); makestripeimage(); 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, stripeimagewidth, 0, gl_rgb, gl_unsigned_byte, stripeimage); gltexgeni(gl_s, gl_texture_gen_mode, gl_object_linear); gltexgenfv(gl_s, gl_object_plane, sgenparams); glenable(gl_depth_test); gldepthfunc(gl_less); glenable(gl_texture_gen_s); glenable(gl_texture_1d); 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);void callback display(void) glclear(gl_color_buffer_bit | gl_depth_buffer_bit); glpushmatrix (); glrotatef(25.0, 1.0, 0.0, 0.0); auxsolidteapot(1.5); glpopmatrix (); glflush();void callback myreshape(glsizei w, glsizei h) float a=3.5; glviewport(0, 0, w, h); glmatrixmode(gl_projection); glloadidentity(); if (w = h) glortho (-a, a, -a*(glfloat)h/(glfloat)w, a*(glfloat)h/(glfloat)w, -a, a); else glortho (-a*(glfloat)w/(glfloat)h, a*(glfloat)w/(glfloat)h, -a, a, -a, a); glmatrixmode(gl_modelview); glloadidentity();void main(void) auxinitdisplaymode (aux_single | aux_rgba); auxinitposition (0, 0, 500, 500); auxinitwindow ( teapot texturemapping); myinit(); auxreshapefunc (myreshape); auxmainloop(display);以上程序运行结果是在屏幕上显示一个带条状纹理的茶壶。其中用到了前面所讲的一维纹理映射定义,以及本节的纹理坐标自动产生。opengl的纹理2008-11-07 15:28在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.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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届内蒙古赤峰市第二中学化学高二上期末统考模拟试题含答案
- 北京市航空航天大学附属中学2026届高二化学第一学期期末教学质量检测试题含答案
- 情商管理培训课件
- 市场促销活动策划方案
- 春节系列文化活动方案
- 生活喜好测试题及答案
- 植物保护考试试题及答案
- 家电公司风险报告编制规定
- 阿克地区温宿二中2026届化学高一上期中质量检测试题含解析
- 甲方采购面试题及答案
- 吉林大学《计算机网络(双语)》2021-2022学年期末试卷
- 水果收货标准
- 急诊专科护士进修汇报课件
- 孩子成长档案模板
- 南京大学介绍
- 【视频号运营】视频号运营108招
- SYT 7328-2021 驱油用石油磺酸盐-PDF解密
- 终身教育、终身学习与学习型社会的全球发展回溯与未来思考
- 河北专业红娘培训课件
- 《北京传统美食》课件
- 0~36个月儿童中医药健康管理服务技术规范
评论
0/150
提交评论