background image

  

glVertex3d(X b, Y, Z);

  

glVertex3d(-X, Y, Z);

  

glEnd();

  以上函数只是生成了一个面片,该面片在横向考虑了压痕线的存在,在生成整个纸盒
时,各个面片由于压痕线和纸厚影响的不同要进行不同的设置,最后利用平移函数根据各
个面片的相对位置将其放入一个栈中,即可生成一个三维纸盒。
  

3.纹理贴图功能的实现

  生成纸盒的结构图后,虽然给其增加了光照,指定了材质,但是对物体表面材质的定
义仅仅局限于颜色的设定上。对真实物体而言,其材质不仅表现为光线反射特性,更重要的
是其表面的纹理特征,可以说纹理是区别材质最重要的因素之一。但是直接在物体表面绘制
纹理是很复杂的,

OpenGL 提供了一个方便的解决方法——纹理映射,即将扫描得到的真

实物体的纹理图形直接映射到场景中的物体表面,从而方便了真实物体纹理的模拟操作。
  利用以上原理,我们可以将纸盒的装潢图案贴到物体表面,从而在纸盒

CAD 系统中生

成纸盒后,用户可以先观察纸盒的三维效果图,满意后再进行生产,从而节约成本。
  纹理映射技术关键是定义纹理、指定纹理在像素上的应用方式及启用纹理。纹理的定义
可用如下函数实现:
 

void glTexImage2D(......);

  该函数可以指定目标纹理、纹理的尺寸、边界宽度等。
  定义了纹理之后,必须说明纹理在像素上的应用方式,该功能通过命令

glTexEnv*()来

实现,其参数决定了像素的最终

RGBA 质的计算方法。纹理在像素上的应用方式主要包括

贴花方式、调制方式和颜色混合模式。在光照下的纹理处理效果必须采用调制方式,因此调
制方式也是应用最多的纹理映射方式。
  定义了纹理的映射方式后,纹理映射还需要启用才能作用于场景。纹理映射的启用和禁
用 是 通 过 命 令

glEnable() 和 glDisable() 实 现 的 。 对 于 一 维 纹 理 和 二 维 纹 理 采 用 参 数

GL_TEXTURE_1D 和 GL_TEXTURE_2D。 

  最后还需要指定纹理坐标和几何坐标,以确定纹理在物体上的粘贴位置和缠绕方式。对
于二维纹理图像来说,其纹理坐标沿两个方向的变化范围均为

0.0~1.0,图像四角的纹理

坐标分别为(

0.0, 0.0)、(0.0, 1.0)、(1.0, 1.0)和(1.0, 0.0),物体坐标则可以取任意值。

当纹理坐标对应于物体四角的几何坐标时,纹理图像恰好覆盖整个物体表面。但当物体太大
时,一般来说需要在物体表面进行纹理缠绕以覆盖整个表面。此时需注意的是纹理图像的左
右边缘和上下边缘应能够自然相接,这样才能使物体表面的纹理表现得比较自然。
  纹理可以自动生成,也可以自由选择位图贴于物体表面。由于纸盒的装潢图案是任意的,
因此我们采用自由选择位图的方法。此时需要采用

Dib 类来打开一幅位图。但是位图的大小

必须是

2 的整数倍。

  我们可以采用如下方式定义纹理控制滤波,说明纹理的映射方式,启用纹理。
  定义纹理:
  

glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height;

  

0,GL_BGR_EXT, GL_UNSIGNED_BYTE, pTextureBits);

  控制纹理:
  

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);