您的位置:首页 > 运维架构

openGL的第一个程序

2013-08-22 18:33 597 查看
首先,配置openGL环境,我用的是集成开发环境是codeblocks。

1、从openGL官网上面下载bin库,解压。

2、把里面的glut.h文件放在codeblocks/MinGW/include/gl目录下,把glut32.lib放在codeblocks/MinGW/lib下,将glut32.dll放在C:/window/system下。

顺便唠几句

codeblocks的MinGW/lib下有很多的.a和.o文件,在unix中每个源文件编译的中间文件(在连接之前)是.a文件。

我们所谓的一个库,那么一个库究竟有什么?——源代码。(头文件.h+源文件.c[pp])。如果我们下载一个库,那么需要我们自己编译,生成中间文件。

所谓的动态链接库和静态库是一个非常知道研究的知识。

我就是这样配置的,第一个测试程序能通过。

上测试源代码:

#include <windows.h>
#include <gl/glut.h>
#include <iostream>

using namespace std;

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(0.25, 0.25, 0.0);
glVertex3f(0.75, 0.25, 0.0);
glVertex3f(0.75, 0.75, 0.0);
glVertex3f(0.25, 0.75, 0.0);
glEnd();

glFlush();
}
int main(int argc, char *argv[])
{
cout << "Hello World!" << endl;

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(320, 240);
glutInitWindowPosition(0, 0);
glutCreateWindow("Hello GL0");

glutDisplayFunc(display);
glutMainLoop();
return 0;
}


下面对该程序做出解释:

#include <windows.h>这个头文件的作用,不清楚,因为用到glut32.dll这个动态链接库,所以哟包含这个头文件吧。猜的。

#include <GL/glut.h> 传说还有2个头文件,但是在<glut.h>这个中已经被包含了,所以不用再次包含,转到codelocks/MinGW/include/GL目录下一个,你就会发现果然还有两个头文件。显然这两个头文件是codeblocks安装是自动安装的,但是我不清楚为什么codeblocks不安装glut.h这个头文件。

然后看main函数,因为main是程序的进入点,程序从这里开始执行。

glutInit(&argc, argv);//对GLUT进行初始化,那么究竟做了什么?先留在这里!!~我也不明白!反正开始必须写的。

glutInitDisplayMode(GLUT_RGB| GLUT_SINGLE);、设置显示模式。原型为void glutInitDisplayMode(unsigned int mode);关于参数的取值和作用查看文档。列举一下常用的

GLUT_RGB 指定RGB颜色模式的窗口。

GLUT_RGBA指定RGBA颜色模式的窗口。关于什么是RGB和RGBA,一个点怎么用像素表示,大概是这个意思。

GLUT_INDEX指定颜色索引模式的窗口。不懂!

GLUT_SINGLE指定单缓存窗口。

GLUT_DOUBLE指定双缓存窗口。额,大概就是两章画布,一张用于显示,一张用于后台填充。

GLUT_DEPTH窗口使用深度缓存。不懂!

glutInitWindowSize(320, 200);指定初始窗口大小。

glutInitWindowPosition(0, 0);指定初始窗口位置。

glutCreateWindow("Hello GL");//creates a top-level window. Usage:int glutCreateWindow(char *name);

http://www.opengl.org/documentation/specs/glut/spec3/node113.html

这个网站不错,是openGL的官方API在线文档。

glutDisplayFunc(display);//这个函数,调用你的画图函数,当需要画图的时候,这个函数会重绘窗口,至于这种机制的实现,我现在还不明白,这个原理很值得研究。

唠叨几句:通常我们在自己编写的程序中经常调用系统接口(也就是系统API,比如unix下的socket,write,read等等函数),然后我们自己的程序编译后有两种情况,可能是将系统函数的源代码加到了我的程序中,编译成可执行文件;另一种情况是我的程序在执行的时候,再去调用系统函数的执行码(这可能就是动态链接)。欢迎拍砖,渴望指点。

但是,有些系统函数在执行的时候,需要调用我们的函数,这可能就是常说的回调。这个应该就是一个回调,至于回调的everything我还不知道!

glutMainLoop();//这应该就是一个监听函数,当需要重绘的时候,这个函数会让glutDisplayFunc运行。

ok!~

欢迎各位爱好者一起交流指点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: