打印本文 打印本文 关闭窗口 关闭窗口
NeHe的opengl教程delphi版(6)----纹理映射(贴图)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1824  更新时间:2009/4/23 18:37:48  文章录入:mintao  责任编辑:mintao
el(GL_SMOOTH);             // 启用阴影平滑
   glClearDepth(1.0);                   // 设置深度缓存
   glEnable(GL_DEPTH_TEST);             // 启用深度测试
   glDepthFunc(GL_LESS);                // 所作深度测试的类型
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正

End;

{现在我们绘制贴图过的立方体。这段代码被狂注释了一把,应该很好懂。开始两行代码 glClear() glLoadIdentity() 是第一课中就有的代码。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 清除屏幕并设为我们在 InitGL() 中选定的颜色,本例中是黑色。深度缓存也被清除。模型观察矩阵也使用glLoadIdentity()重置。}

Procedure glDraw();
Begin
   glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
   glLoadIdentity();                    // 重置当前的模型观察矩阵
   glTranslatef(0.0, 0.0, -6.0);        // 移入屏幕6个单位

   //下面三行使立方体绕X、Y、Z轴旋转。
   //旋转多少依赖于变量 xrot , yrot 和 zrot 的值。
   glRotatef(xrot, 1.0, 0.0, 0.0);      // 绕X轴旋转
   glRotatef(yrot, 0.0, 1.0, 0.0);      // 绕Y轴旋转
   glRotatef(zrot, 0.0, 0.0, 1.0);      // 绕Z轴旋转

   //下一行代码选择我们使用的纹理。
   //如果在场景中使用多个纹理,应该使用
   //glBindTexture(GL_TEXTURE_2D, texture[ 所使用纹理对应的数字 ]) 来选择要绑定的纹理。
   //当想改变纹理时,应该绑定新的纹理。
   //有一点值得指出的是,
   //不能在 glBegin() 和 glEnd() 之间绑定纹理,
   //必须在 glBegin() 之前或 glEnd() 之后绑定。
   //注意我们在后面是如何使用 glBindTexture 来指定和绑定纹理的。

   glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择纹理

   //为了将纹理正确的映射到四边形上,
   //必须将纹理的右上角映射到四边形的右上角,
   //纹理的左上角映射到四边形的左上角,
   //纹理的右下角映射到四边形的右下角,
   //纹理的左下角映射到四边形的左下角。
   //如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。

   //glTexCoord2f 的第一个参数是X坐标。
   // 0.0是纹理的左侧。 0.5是纹理的中点, 1.0是纹理的右侧。
   //glTexCoord2f 的第二个参数是Y坐标。
   //0.0是纹理的底部。 0.5是纹理的中点, 1.0是纹理的顶部。
   //所以纹理的左上坐标是 X:0.0f,Y:1.0f ,
   //四边形的左上顶点是 X: -1.0f,Y:1.0f 。
   //其余三点依此类推。

   //试着玩玩 glTexCoord2f 的X,Y坐标参数。
   //把1.0改为0.5将只显示纹理的左半部分,
   //把0.0改为0.5将只显示纹理的右半部分。
   glBegin(GL_QUADS);
   // 前面
   glTexCoord2f(0.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);         // 纹理和四边形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(1.0, -1.0, 1.0);          // 纹理和四边形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(1.0, 1.0, 1.0);           // 纹理和四边形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(-1.0, 1.0, 1.0);          // 纹理和四边形的左上
   // 后面
   glTexCoord2f(1.0, 0.0);
   glVertex3f(-1.0, -1.0, -1.0);        // 纹理和四边形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);         // 纹理和四边形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);          // 纹理和四边形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(1.0, -1.0, -1.0);         // 纹理和四边形的左下
   // 顶面
   glTexCoord2f(0.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);         // 纹理和四边形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(-1.0, 1.0, 1.0);          // 纹理和四边形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(1.0, 1.0, 1.0);           // 纹理和四边形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);          // 纹理和四边形的右上
   // 底面
   glTexCoord2f(1.0, 1.0);
   glVertex3f(-1.0, -1.0, -1.0);        // 纹理和四边形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(1.0, -1.0, -1.0);         // 纹理和四边形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(1.0, -1.0, 1.0);          // 纹理和四边形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);         // 纹理和四边形的右下
   // 右面
   glTexCoord2f(1.0, 0.0);
   glVertex3f(1.0, -1.0, -1.0);         // 纹理和四边形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);          // 纹理和四边形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(1.0, 1.0, 1.0);           // 纹理和四边形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(1.0, -1.0, 1.0);          // 纹理和四边形的左下
   // 左面
   glTexCoord2f(0.0, 0.0);
   glVertex3f(-1.0, -1.0, -1.0);        // 纹理和四边形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);         // 纹理和四边形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(-1.0, 1.0, 1.0);          // 纹理和四边形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);         // 纹理和四边形的左上
   glEnd();

   xrot := xrot + 0.3;                  // X 轴旋转
   yrot := yrot + 0.2;                  // Y 轴旋转
   zrot := zrot + 0.4;                  // Z 轴旋转
End;

{最后,关于用作纹理的图像我想有几点十分重要,并且您必须明白。此图像的宽和高必须是2的n次方;宽度和高度最小必须是64象素;并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度和高度不是64,128,256象素的话,使用图像处理软件重新改变图像的大小。可以肯定有办法能绕过这些限制,但现在我们只需要用标准的纹理尺寸。}

//OK!运行一下看看效果

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口