金谊河畔物业电话:GLUT基础

来源:百度文库 编辑:偶看新闻 时间:2024/04/25 11:39:16

[译者注] 我是一个OpenGL新手,这是我第一次翻译OpenGL文章,翻译不足之处请多见谅!

         希望和大家,特别的OpenGL的热爱者多交流。

            MSN:wangzhi0417@hotmail.com

在本篇教程中我将谈及如何在VC++中设置和使用OpengGL和GLUT。我将引导你初始化你的GLUT显示,打开一个窗口和显示一个三角形。你将学习的内容是你以后创建更加复杂的GLUT工程的基础。

 

什么是GLUT?

GLUT代表OpenGL Utility Toolkit。它是由Mark Kilgard为OpenGL写的一个API。创建使用GLUT比传统的Win32 OpenGL更加容易,对初学者来说,是大有裨益的。因为GLUT处理输入和窗体的创建,GLUT代码和平台无关,意味着你写的任何应用都可以在任何平台上运行(除非你开始添加DirectSound代码)。

 

获得GLUT文件

你可以从这里下载GLUT最新的版本。

当你已经下载并解压了文件,拷贝glut32.dll到你的windows\system目录,拷贝glut32.lib到你的编译器的lib目录并将glut.h拷贝到你的编译器的include\gl目录。现在你准备就绪了。

创建你的GLUT工程

启动VC++,建立一个空的控制台应用程序。

在project>settings中设置链接到glut32.lib,glu32.lib和opengl32.lib。

 

程序

以下代码包含了要用到的库的头文件并且声明我们的函数。

#include           //header file for windows

#include             //header file for openGL

#include            //header file for the openGL utility library

#include          //header file for GLUT

 

static void redraw(void);          //declarations

int main(int argc, char **argv);

 

变量argc包含了传递到程序的参数的数目,argv是一个指向参数的指针。我们不需要特别地为这两个参数担忧,只需要将他们传给glutInit(),让其能够处理发送到GLUT的任何命令行参数。

 

glutInitDisplayMode函数用来设置显示模式。我们可以用以下的flags来调用它:

  • GLUT_RGB 指明我们想在我们的窗口中使用一个RGB颜色缓存区。
  • GLUT_DOUBLE 指明我们想要一个双缓冲区。双缓冲区使我们在图像被送到屏幕前完成绘制,从而防止闪烁。
  • GLUT_DEPTH 指明我们想要一个深度缓冲区。深度缓冲区确保靠近camera的物体永远在较远的物体上面,否则输出容易杂乱。当我们只绘制单个的三角形的时候,这就没有必要,这是一个很好的应用,所以我们将一直包含它。

 

 

glutCreateWindow()函数创建供我们绘制的窗口。glutDisplayFunc()指明我们绘制屏幕的函数,我们将在下面介绍。GLUT在显示需要更新的时候调用这个函数。

int main(int argc, char **argv)

{

  glutInit(&argc,argv);                  //initializes the GLUT framework

  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 

//sets up the display mode

  glutCreateWindow("My first GLUT program");            //creates a window

  glutDisplayFunc(redraw);                //specifies our redraw function

 

下面我们需要设置投影矩阵(projection matrix)。投影矩阵是一个4 x4的矩阵,用来将点从他们的和camera有关的位置转换到屏幕上的位置。我们用它来指明我们的场景(scene)怎样投影到屏幕。为了改变它,我们需要用GL_PROJECTION参数调用glMatrixMode()。gluPerspective()函数为我们创建一个透视变换的投影矩阵。我们所要做的是指定视角(view angle),宽高比(aspect ratio)和远近的剪切平面的位置。

 

glMatrixMode(GL_PROJECTION);   //changes the current matrix to the //projection matrix

 

  //sets up the projection matrix for a perspective transform

  gluPerspective(45,     //view angle

                 1.0,    //aspect ratio

                 10.0,   //near clip

                 200.0); //far clip

 

当我们完成时,我们将当前的矩阵切换成modelview矩阵。modelview矩阵是一个4 x4矩阵,用来将点从它们的实际位置(world space)转换成相对于camera的位置。这个矩阵被我们用来指定我们camera的位置和我们想绘制的任何物体的位置,glutMainLoop()函数是GLUT框架中的主循环函数,我们下一步将调用它。

 

  glMatrixMode(GL_MODELVIEW);   //changes the current matrix to the  //modelview matrix

  glutMainLoop();               //the main loop of the GLUT framework

 

  return 0;

}

 

下一步我们需要创建我们的redraw()函数,其作用是绘制我们的三角形。用GL_COLOR_BUFFER_BIT和GL_DEPTH_BUFFER_BIT调用glClear()将清空我们窗口的颜色和深度缓冲区。我们需要在我们绘制之前做这个工作。

 

 

static void redraw(void)                       //all drawing code goes here

{

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

//clears the colour and depth buffers

现在我们差不多准备开始绘制了。首先我们需要用glPushMatrix()来存储我们camera的位置(在x,y,z轴的(0,0,0) - 我们世界的中心),并且将它在Z轴移动100,有效地将照相机向后移,使我们能看清楚我们所绘制的图形。因为modelview矩阵指定了相对于camera的绘制位置,为移动camera我们需要以camera相反的转换来变换modelview矩阵,所以移动照相机到(0,0,100),我们变换modelview矩阵为(0,0,-100)。这和移动我们的三角形到(0,0,-100)有相同的效果。

glPushMatrix();   //saves the current matrix on the top of the matrix stack

  glTranslatef(0,0,-100); //translates the current matrix 0 in x, 0 in //y and -100 in z

现在我们开始绘制三角形。为了做这个,我们需要调用glBegin(GL_TRIGANGLES),它将告诉OpenGL我们将要开始绘制三角形。OpenGL而后将每三个顶点视作一个三角形的顶点,并且在调用glEnd()时将三角形绘制到我们的窗口。

 

在glBegin()和glEnd()之间,我们需要用glVertex3f指定3个顶点。在每个glVertex3f()调用中的3个值是顶点在世界空间中的X,Y和Z坐标。我们也能用在调用glVertex3f前调用glColor3f()指定每个顶点的颜色。我们调用glColor3f()的参数是组合成颜色的红色、绿色和蓝色分量(从0到1)。OpenGL将在三角形中混合这些颜色。

 

 

 

  glBegin(GL_TRIANGLES);  //tells OpenGL that we're going to start  //drawing triangles

  glColor3f(1,0,0);       //sets the current colour to red

  glVertex3f(-30,-30,0);  //specifies the first vertex of our triangle

 

  glColor3f(0,1,0);       //sets the current colour to green

  glVertex3f(30,-30,0);   //specifies the second vertex of our triangle

 

  glColor3f(0,0,1);       //sets the current colour to blue

  glVertex3f(-30,30,0);   //specifies the third vertex of our triangle

  glEnd();                //tells OpenGL that we've finished drawing

 

 

下一步我们用glPopMatrix()从矩阵栈(matrix stack)中重新得到我们先前保存的矩阵,将camera的位置设置回(0,0,0),为下一帧做准备。因为我们使用了双缓冲,所有的绘制工作在后缓冲区(back buffer)(不可见的缓冲区)中完成。现在帧绘制完成,我们调用glutSwapBuffers()来交换前缓冲区(可见的缓冲区)和后缓冲区,使我们所绘制的可见。

  glPopMatrix();         //retrieves our saved matrix from the top of the // matrix stack

  glutSwapBuffers();      //swaps the front and back buffers

}                         //The end of our program!

 

好的!在我们程序和教程的结束,编译你的程序试试。

希望通过本篇教程的帮助,你现在应该能建立和初始化一个GLUT程序并绘制三角形。如果你想对这片教程反馈意见或是有任何问题,请发邮件给我.