NeHe的opengl教程delphi版(1)----基本框架将CKER翻译的NeHe的VC的OPENGL框架转成了Delphi版,希望对用Delphi学习OPENGL的兄弟有所帮助,不知为什么,我的Delphi环境下无法直接运行,但是在别的机器上好像没问题我的机器只能编译后运行EXE文件。感谢NeHe提供的这么好的框架,感谢CKER翻译的VC的资料ProgramProject1;Usesopengl,windows,Messages;ConstWND_TITLE='OPenGl基本框架';//标题Var//===========================================================================//每一个OpenGL都被连接到一个着色描述表上。着色描述表将所有的OpenGL调用命令连//接到DeviceContext(设备描述表)上,将OpenGL的着色描述表定义为hRC,要让程序能//够绘制窗口的话,还需要创建一个设备描述表,Windows的设备描述表被定义为hDC,//DC将窗口连接到GDI(GraphicsDeviceInterface图形设备接口)。而RC将OpenGL连接//到DC。//===========================================================================h_RC:HGLRC;//RenderingContext(着色描述表)。h_DC:HDC;//DeviceContext(设备描述表)h_Wnd:HWND;//窗口句柄h_Instance:HINST;//程序Instance(实例)。keys:Array[0..255]OfBoolean;//用于键盘例程的数组{$R*.res}//==============================================================================//重新设置OpenGL场景的大小,而不管窗口的大小是否已经改变(假定没有使用全屏模式)。//甚至无法改变窗口的大小时(例如在全屏模式下),它至少仍将运行一次————————//在程序开始时设置透视图。OpenGL场景的尺寸将被设置成它显示时所在窗口的大小。//==============================================================================ProcedureglResizeWnd(Width,Height:Integer);//重置并初始化GL窗口大小BeginIf(Height=0)Then//防止高度为0,产生除0异常Height:=1;glViewport(0,0,Width,Height);//重置当前的视口(Viewport)//下面几行为透视图设置屏幕。意味着越远的东西看起来越小。这么做创建了一个现实//外观的场景。此处透视按照基于窗口宽度和高度的45度视角来计算。0.1f,100.0f是//我们在场景中所能绘制深度的起点和终点。//glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响projectionmatrix(投影矩阵)。//投影矩阵负责为我们的场景增加透视。//glLoadIdentity()近似于重置。它将所选的矩阵状态恢复成其原始状态。//调用glLoadIdentity()之后我们为场景设置透视图。glMatrixMode(GL_PROJECTION);//选择投影矩阵glLoadIdentity();//重置投影矩阵gluPerspective(45.0,Width/Height,0.1,100.0);//计算窗口的外观比例//glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响modelviewmatrix(模型观察矩阵)。//模型观察矩阵中存放了我们的物体讯息。glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵glLoadIdentity();//重置模型观察矩阵//如果现在还不能理解这些术语的含义,请别着急。//只要知道如果想获得一个精彩的透视场景的话,必须这么做。End;//==============================================================================//对OpenGL进行所有的设置。将设置清除屏幕所用的颜色,打开深度缓存,//启用smoothshading(阴影平滑),等等。这个例程直到OpenGL窗口创建之后才会被调用。//此过程将有返回值。但此处的初始化没那么复杂,现在还用不着担心这个返回值。//==============================================================================ProcedureglInit();Begin//设置清除屏幕时所用的颜色。如果对色彩的工作原理不清楚的话,快速解释一下。//色彩值的范围从0.0f到1.0f。0.0f代表最黑的情况,1.0f就是最亮的情况。//glClearColor后的第一个参数是RedIntensity(红色分量),第二个是绿色,第三个是蓝色。//最大值也是1.0f,代表特定颜色分量的最亮情况。最后一个参数是Alpha值。//当它用来清除屏幕的时候,不用关心第四个数字。现在让它为0.0f。//通过混合三种原色(红、绿、蓝),可以得到不同的色彩//因此,使用glClearColor(0.0f,0.0f,1.0f,0.0f),您蓝色来清除屏幕。//如果用glClearColor(0.5f,0.0f,0.0f,0.0f)的话,将使用中红色来清除屏幕。//不是最亮(1.0f),也不是最暗(0.0f)。要得到白色背景,应该将所有的颜色设成最亮(1.0f)。//要黑色背景的话,该将所有的颜色设为最暗(0.0f)。glClearColor(0.0,0.0,0.0,0.0);//黑色背景//阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。glShadeModel(GL_SMOOTH);//启用阴影平滑//接下来必须做的是关于depthbuffer(深度缓存)的。将深度缓存设想为屏幕后面的层。//深度缓存不断的对物体进入屏幕内部有多深进行跟踪。本程序其实没有真正使用深度缓存,//但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画。//这样您就不会将一个圆形后面的正方形画到圆形上来。深度缓存是OpenGL十分重要的部分。glClearDepth(1.0);//设置深度缓存glEnable(GL_DEPTH_TEST);//启用深度测试glDepthFunc(GL_LESS);//所作深度测试的类型//接着告诉OpenGL我们希望进行最好的透视修正。//这会十分轻微的影响性能。但使得透视图看起来好一点。glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精细的透视修正End;//==============================================================================//所有的绘图代码。任何您所想在屏幕上显示的东东都将在此段代码中出现。//以后的每个程序会在此处增加新的代码。//==============================================================================ProcedureglDraw();BeginglClear(GL_COLOR_BUFFER_BITOrGL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存glLoadIdentity();//重置当前的模型观察矩阵End;FunctionWndProc(hWnd:HWND;//窗口的句柄Msg:UINT;&nbNeHe的opengl教程delphi版(2)----创建三角形和四边形继续利用上面的框架,我们可以很方便的进行我们的OPENGL编程(NeHe的教程也是围绕这个框架展开的,而且我看老外的源码,很多使用这个框架的)下面我们在窗体上画一个三角和一个正方形只要在ProcedureglDraw();中添加以下代码即可//==============================================================================//所有的绘图代码。任何您所想在屏幕上显示的东东都将在此段代码中出现。//以后的每个程序会在此处增加新的代码。//==============================================================================ProcedureglDraw();BeginglClear(GL_COLOR_BUFFER_BITOrGL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存//当您调用glLoadIdentity()之后,您实际上讲当前点移到了屏幕中心,X坐标轴从左至右,//Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。//中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。//移入屏幕深处是负值,移出屏幕则是正值。glLoadIdentity();//重置当前的模型观察矩阵//glTranslatef(x,y,z)沿着X,Y和Z轴移动。//根据前面的次序,下面的代码沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。//注意在glTranslatef(x,y,z)中当您移动的时候,您并不是相对屏幕中心移动,//而是相对与当前所在的屏幕位置。glTranslatef(-1.5,0.0,-6.0);//左移1.5单位,并移入屏幕6.0//现在我们已经移到了屏幕的左半部分,//并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景-创建三角形。//glBegin(GL_TRIANGLES)的意思是开始绘制三角形,glEnd()告诉OpenGL三角形已经创建好了。//通常您会需要画3个顶点,可以使用GL_TRIANGLES。//在绝大多数的显卡上,绘制三角形是相当快速的。//如果要画四个顶点,使用GL_QUADS的话会更方便。//但据我所知,绝大多数的显卡都使用三角形来为对象着色。//最后,如果您想要画更多的顶点时,可以使用GL_POLYGON。//本节的简单示例中,我们只画一个三角形。//如果要画第二个三角形的话,可以在这三点之后,再加三行代码(3点)。//所有六点代码都应包含在glBegin(GL_TRIANGLES)和glEnd()之间。//在他们之间再不会有多余的点出现,//也就是说,(GL_TRIANGLES)和glEnd()之间的点都是以三点为一个集合的。//这同样适用于四边形。如果您知道实在绘制四边形的话,//您必须在第一个四点之后,再加上四点为一个集合的点组。//另一方面,多边形可以由任意个顶点,//(GL_POLYGON)不在乎glBegin(GL_TRIANGLES)和glEnd()之间有多少行代码。//几何图元类型和说明//类型说明//GL_POINTS单个顶点集//GL_LINES多组双顶点线段//GL_POLYGON单个简单填充凸多边形//GL_TRAINGLES多组独立填充三角形//GL_QUADS多组独立填充四边形//GL_LINE_STRIP不闭合折线//GL_LINE_LOOP闭合折线//GL_TRAINGLE_STRIP线型连续填充三角形串//GL_TRAINGLE_FAN扇形连续填充三角形串//GL_QU