金谊河畔物业电话:GLUT基础
[译者注] 我是一个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
#include
#include
#include
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程序并绘制三角形。如果你想对这片教程反馈意见或是有任何问题,请发邮件给我.