重拾OpenGL(1)


一、安装
现在的VS都会自带OpenGL的库,在C:\Program Files\Microsoft SDKs\Windows\v7.0A目录下。其中头文件在Include\gl目录下,lib文件在Lib目录下,dll文件则自动被放在system32目录中。
其中头文件有:
gl.h:OpenGL使用的函数和常量的声明
glu.h:GLU(OpenGL实用库)所使用的函数和常量声明。GLU库属于OpenGL标准的一部分。它包含了43个函数,每个函数名都是以“glu”开头。

OpenGL仅提供了绘图等操作,但对于创建应用程序窗口等工作仍需要利用微软提供的Windows API来完成,这是一个比较繁琐的工作。
Mark J.Kilgard  为了使OpenGL应用程序结构能够真正独立于窗口系统而构思了GLUT库。该库提供了一些简单的函数使得窗口的创建工作变得很简单(早期这个工作是由GLAUX库完成,现在这个库已经被GLUT库替代),这样程序员就可以将主要精力放在渲染自己的OpenGL工程上。
GLUT的库包含5个文件
glut.h:GLUT(OpenGL实用工具包)所使用的函数和常量声明,基本上是用于做窗口界面的。
注:该头文件中自动包含了<gl/gl.h>和<gl/glu.h>
glut.lib, glut32.lib:GLUT的静态链接库(编译时用)。前者用于SGI,后者用于Microsoft,用户根据自己使用的系统选择,放入Lib目录下。
glut.dll, glut32.dll:GLUT的动态链接库(运行时用)。必须放在system32目录下。



二、编程的常用函数和注意事项

利用GLUT库编写OpenGL程序和编写一般的console程序没有太大差别,函数的主体包含在main函数中,然后在main函数之外定义多个函数供main函数调用(只不过调用方式有所区别,后面会讲到)。

main函数中一般要依次使用以下函数:
1. void glutInit(int* argc, char** argv);
     该函数中的两个输入参数正是传递给main函数的两个,这里 根据传入的参数做一些用户期望的初始化工作

2. void glutInitWindowPosition(int x, int y);
   void glutInitWindowSize(int width, int height);
     初始化, 定义窗口的位置和大小

3. void glutInitDisplayMode(unsigned int mode);
     定义窗口的显示模式。参数mode指定了 颜色模式、数量和缓冲区类型
     指定颜色模式的预定义常量有:
1)GLUT_RGB或GLUT_RGBA - 指定一个RGBA窗口,默认值;
2)GLUT_INDEX - 指定颜色索引模式。
     选择单缓冲区或双缓冲区窗口:
1)GLUT_SINGLE - 单缓冲区窗口
2)GLUT_DOUBLE - 双缓冲区窗口
     指定特殊的缓冲:
1)GLUT_ACCUM - 累积缓冲区
2)GLUT_STRNCIL - 模板缓冲区
3)GLUT_DEPTH - 深度缓冲区(当需要渲染三维立体图时,这个参数最常用)

     当要指定多个模式时,用“|”连接。比如要指定一个RGBA窗口,双缓冲区,深度缓冲:
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

4. 经过上述步骤,就可以调用函数 glutCreateWindow()创建窗口了。
     该函数接受一个char*类型的参数,该参数指定了窗口的标题。返回值是该窗口的标识符。

5. 窗口创建完成后,就可以画图了。通常不将渲染的具体操作放在main函数中,而是在main函数之外定义一个任意函数名的函数,比如renderScene()。该函数中定义了窗口刚创建时的图像渲染操作,其输入参数和返回值必须为void(至于为什么马上就会讲到)。
     然后 在main函数中使用void glutDisplayFunc()调用renderScene(),调用方法很简单,直接将函数名传递给glutDisplayFunc()。renderScene()函数的输入参数和返回值必须为void也是由glutDisplayFunc()的定义决定的。

6. glutDisplayFunc()函数只会在窗口创建时调用一次,如果渲染的是静态图像,可以只使用这个函数,因为之后的显示都不会再变。但如果渲染的是一个动画,随着时间变化需要进行新的渲染操作,那么就需要使用另外一个glut函数: void glutIdleFunc()
     该函数与glutDisplayFunc()用法相同,只不过该函数调用的函数是 在窗口闲置的时候进行的渲染操作

7. 还有一个重要操作不能忘记。在程序运行过程中,用户可能会改变窗口的大小,这样窗口内的图像都要重新计算。和上述两个操作类似,我们可以在main函数之外定义一个函数来完成这些操作,然后将该函数的函数名传递给 glutReshapeFunc()函数。
注:该函数在窗口创建的时候就会被调用一次。

8. 最后一件事是 告诉glut我们准备进入应用程序事件处理循环。GLUT提供了一个函数让程序进入一个永不结束的循环。一直等待处理下一个事件。函数是 void glutMainLoop()。 


最终的main函数如下:
void main(int argc, char **argv) {
              // 根据用户输入做的初始化操作 
              glutInit(&argc, argv); 
              // 指定窗口的显示模式,包括颜色和缓冲区设置
              glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
              // 指定窗口的位置和大小 
              glutInitWindowPosition(100,100); 
              glutInitWindowSize(320,320);
              // 创建窗口 
              glutCreateWindow("3D Tech- GLUT Tutorial"); 

              // 指定窗口刚刚创建时的渲染操作
              glutDisplayFunc(renderScene);
              // 指定窗口闲置时的渲染操作
              glutIdleFunc(renderScene);
              // 指定窗口大小改变时重新计算投影的方式
              glutReshapeFunc(changeSize);
              // 进入应用程序事件处理循环
              glutMainLoop(); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值