转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
NeHe的opengl教程delphi版(7)----滤波         ★★★★

NeHe的opengl教程delphi版(7)----滤波

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2417 更新时间:2009/4/23 18:37:25
sp; TextureImage[0].data);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  // 线形滤波
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // 线形滤波

         //下面是创建纹理的新方法。 Mipmapping!
         //『译者注:这个词的中文我翻不出来,不过没关系。看完这一段,您就知道意思最重要。』
         //您可能会注意到当图像在屏幕上变得很小的时候,很多细节将会丢失。
         //刚才还很不错的图案变得很难看。当您告诉OpenGL创建一个 mipmapped的纹理后,
         //OpenGL将尝试创建不同尺寸的高质量纹理。当您向屏幕绘制一个mipmapped纹理的时候,
         //OpenGL将选择它已经创建的外观最佳的纹理(带有更多细节)来绘制,
         //而不仅仅是缩放原先的图像(这将导致细节丢失)。
         //我曾经说过有办法可以绕过OpenGL对纹理宽度和高度所加的限制——64、128、256,等等。
         //办法就是 gluBuild2DMipmaps。据我的发现,您可以使用任意的位图来创建纹理。
         //OpenGL将自动将它缩放到正常的大小。
         //因为是第三个纹理,我们将它存到texture[2]。这样本课中的三个纹理全都创建好了。
         // 创建 MipMapped 纹理
         glBindTexture(GL_TEXTURE_2D, texture[2]);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
            GL_LINEAR_MIPMAP_NEAREST);  // ( 新增 )
         //下面一行生成 mipmapped 纹理。
         //我们使用三种颜色(红,绿,蓝)来生成一个2D纹理。
         //TextureImage[0].sizeX 是位图宽度,
         //TextureImage[0].sizeY 是位图高度,
         //(====不知为什么,delphi下这个函数没有height这个参数,
         //但是帮助中却有,不知delphi再搞什么,郁闷ing......
         //最后我在前面自己写了一个gluBuild2DMipmaps,
         //来载入glu32.dll中的gluBuild2DMipmaps函数=====)
         //GL_RGB意味着我们依次使用RGB色彩。
         //GL_UNSIGNED_BYTE 意味着纹理数据的单位是字节。
         //TextureImage[0].data指向我们创建纹理所用的位图。
         gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0].sizeX,
            TextureImage[0].sizey, GL_RGB, GL_UNSIGNED_BYTE,
            TextureImage[0].data);      //(新增)  }
      End;
   If assigned(TextureImage[0]) Then    // 纹理是否存在
      If assigned(TextureImage[0].data) Then // 纹理图像是否存在
         TextureImage[0].data := Nil;   // 释放纹理图像占用的内存
   TextureImage[0] := Nil;              // 释放图像结构
   result := Status;                    // 返回 Status
End;

//接着应该载入纹理并初始化OpenGL设置了。
//GLInit函数的第一行使用上面的代码载入纹理。
//创建纹理之后,我们调用glEnable(GL_TEXTURE_2D)启用2D纹理映射。
//阴影模式设为平滑阴影( smooth shading )。
//背景色设为黑色,我们启用深度测试,然后我们启用优化透视计算。

Procedure glInit();                     // 此处开始对OpenGL进行所有设置
Begin
   If (Not LoadTexture) Then            // 调用纹理载入子例程
      exit;                             // 如果未能载入,退出

   glEnable(GL_TEXTURE_2D);             // 启用纹理映射
   glShadeModel(GL_SMOOTH);             // 启用阴影平滑
   glClearColor(0.0, 0.0, 0.0, 0.0);    // 黑色背景
   glClearDepth(1.0);                   // 设置深度缓存
   glEnable(GL_DEPTH_TEST);             // 启用深度测试
   glDepthFunc(GL_LESS);                // 所作深度测试的类型
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //高度优化的透视投影计算

   //现在开始设置光源。下面下面一行设置环境光的发光量,
   //光源light1开始发光。
   //这一课的开始处我们我们将环境光的发光量存放在LightAmbient数组中。
   //现在我们就使用此数组(半亮度环境光)。
   glLightfv(GL_LIGHT1, GL_AMBIENT, @LightAmbient[0]); // 设置环境光
   //接下来我们设置漫射光的发光量。它存放在LightDiffuse数组中(全亮度白光)。
   glLightfv(GL_LIGHT1, GL_DIFFUSE, @LightDiffuse[0]); // 设置漫射光
   //然后设置光源的位置。
   //位置存放在 LightPosition 数组中
   //(正好位于木箱前面的中心,X-0.0,Y-0.0,Z方向移向观察者2个单位<位于屏幕外面>)。
   glLightfv(GL_LIGHT1, GL_POSITION, @LightPosition); // 光源位置
   //最后,我们启用一号光源。我们还没有启用GL_LIGHTING,
   //所以您看不见任何光线。
   //记住:只对光源进行设置、定位、甚至启用,光源都不会工作。
   //除非我们启用GL_LIGHTING。
   glEnable(GL_LIGHT1);                 // 启用一号光源

End;
//下一段代码绘制贴图立方体。我只对新增的代码进行注解。
//如果您对没有注解的代码有疑问,回头看看第六课。

Procedure glDraw();                     // 从这里开始进行所有的绘制
Begin
   glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
   glLoadIdentity();                    // 重置当前的模型观察矩阵

   //下三行代码放置并旋转贴图立方体。
   //glTranslatef(0.0,0.0,z)将立方体沿着Z轴移动Z单位。
   //glRotatef(xrot,1.0f,0.0f,0.0f)将立方体绕X轴旋转xrot。
   //glRotatef(yrot,0.0f,1.0f,0.0f)将立方体绕Y轴旋转yrot。
   glTranslatef(0.0, 0.0, z);           // 移入/移出屏幕 z 个单位
   glRotatef(xrot, 1.0, 0.0, 0.0);      // 绕X轴旋转
   glRotatef(yrot, 0.0, 1.0, 0.0);      // 绕Y轴旋转

   //下一行与我们在第六课中的类似。
   //有所不同的是,这次我们绑定的纹理是texture[filter],
   //而不是上一课中的texture[0]。
   //任何时候,我们按下F键,filter 的值就会增加。
   //如果这个数值大于2,变量filter 将被重置为0。
   //程序初始时,变量filter 的值也将设为0。
   //使用变量filter 我们就可以选择三种纹理中的任意一种。
   glBindTexture(GL_TEXTURE_2D, texture[filter]); // 选择由filter决定的纹理

   glBegin(GL_QUADS);                   // 开始绘制四边形
   //glNormal3f是这一课的新东西。Normal就是法线的意思,
   //所谓法线是指经过面(多边形)上的一点且垂直于这个面(多边形)的直线。
   //使用光源的时候必须指定一条法线。法线告诉OpenGL这个多边形的朝向,并指明多边形的正面和背面。
   //如果没有指定法线,什么怪事情都可能发生:不该照亮的面被照亮了,多边形的背面也被照亮....。
   //对了,法线应该指向多边形的外侧。看着木箱的前面您会注意到法线与Z轴正向同向。
   //这意味着法线正指向观察者-您自己。这正是我们所希望的。
   //对于木箱的背面,也正如我们所要的,法线背对着观察者。
   //如果立方体沿着X或Y轴转个180度的话,前侧面的法线仍然朝着观察者,背面的法线也还是背对着观察者。
   //换句话说,不管是哪个面,只要它朝着观察者这个面的法线就指向观察者。
   //由于光源紧邻观察者,任何时候法线对着观察者时,这个面就会被照亮。
   //并且法线越朝着光源,就显得越亮一些。
   //如果您把观察点放到立方体内部,你就会法线里面一片漆黑。
   //因为法线是向外指的。如果立方体内部没有光源的话,当然是一片漆黑。
   // 前面
   glNormal3f(0.0, 0.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);          // 纹理和四边形的左上
   // 后面
   glNormal3f(0.0, 0.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);         // 纹理和四边形的左下
   // 顶面
   glNormal3f(0.0, 1.0, 0.0);     &nbs

上一页  [1] [2] [3] [4]  下一页


[系统软件]InstallShield Express for delphi制作安装程序定…  [常用软件]InstallShield Express制作Delphi数据库安装程序
[Delphi程序]为什么选择Delphi.Net ?  [Delphi程序]《关于VisiBroker For Delphi的使用》(4)
[Delphi程序]Delphi 程序员代码编写标准指南  [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro…
[Delphi程序]Borland Delphi 9 的新特性  [Delphi程序]Delphi 键盘码表
[Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗?  [Delphi程序]Delphi Access violations 问题的解决之道
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台