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 问题的解决之道
|