没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
GLUT教程 (一) 简介
为了用 GLUT 写一个 C 语言程序你需要有三个文件:
1:glut.h—这个头文件是要包含到你的代码里的去的。一般把这个文件放到、include/gl 文
件夹里。
2:glut.lib 和 glut32.lib(glut.lib 是 SGI 的,glut32.lib 是 Microsoft 的。好像就是看你用的什
么操作系统了。一般 down 的这两个文件都有)这个文件必须连接到你的程序。所以必须放
在 lib 文件夹里。
3:glut32.dll(windows)和 glut.dll(SGI)--这个文件必须放在 system32 文件夹里。
在 VC/VC6.0 里的设置
有 Visual C/C++里建立工程可以有两个选择:控制台(console)和 Win32。第一个是最
常用的,选第一个的话,应用程序将会有两个窗口,一个控制台窗口(就是命令行那样的窗
口)一个 OpenGL 窗口。选择 Win32 的也有可能用 GLUT 和 windows 编程结合建立一个应
用程序。所有你必须做的是改变一个设置。
主菜单中选择“工程”(project)->“设置”(setting)
对话框中选择“连接”(link)标签。
在“分类”(Category)组合框里选择“输出”(output)
再在“入口点”(Entry-point symbol)文本框里键入“mainCRTStartup”
对一个现有的控制台应用程序,有一个简单的办法把它转换成 Win32 应用程序,这样
可以摆脱那个命令行窗口。
1:接着上面的添加入口点的那个标签。
2:在“工程选项”(Project options)文本框里把“subsystem:console”替换成“subsystem:windows”
你也可以仅仅在你的代码的开头添加下面的这一行代码,而不进行上述设置。
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
现在这个应用程序就没有控制台窗口,只有 OpenGL 窗口。为了把 GLUT 连接到一个
程序里,你还得进行以下几步。
1:选择“工程”(project)->“设置”(settings)。
2:选择“连接”(Link)标签。
3 :增加下面的文件到“ 对象/ 库模块”(Object/library
modules):OpenGL32.lib,glut32.lib,glu32.lib.(一般加一个 glut32.lib 就可以了,添加多个请用空
格间隔开来)。
上面添加了 glut32.lib,和 opengl32.lib。这两个都是标准 OpenGL 的库,glu 是一个 API
来自标准的 OpenGL 扩充。
在 VS.NET 里使用 OpenGL
很多人在使用 VS.NET 来建立 OpenGL 应用程序时,都遇到了一个小问题:一个编译器错误。
根据我所知道的,好像仅存在与 VS 2003 和 VS2005 的编译器里。下面是 VS2005 里产生的
错误。
c:/programas/microsoft visual studio 8/vc/include/stdlib.h(406) :
error C2381: 'exit' : redefinition; __declspec(noreturn) differs
c:/opengl/toolkits/includes/gl/glut.h(146) : see declaration of 'exit'
这个问题好像是因为包含文件时 glut.h 在 stdlib.h 的前面。改下顺序就可以解决这个问题。
把
#include <GL/glut.h>
#include <stdlib.h>
改成
#include <stdlib.h>
#include <GL/glut.h>
GLUT教程(二) GLUT初始化
在这个部分我们将在我们的程序里建立一个 main 函数,这个 main 函数将完成必须的初
始化和开启事件处理循环。所有的 GLUT 函数都有 glut 前缀并且那些完成一些初始化的函
数有 glutInit 前缀。你首先要做的是调用函数 glutInit()。
Void glutInit(int*argc,char**argv);
参数:
Argc:一个指针,指向从 main()函数传递过来的没更改的 argc 变量。
Argv:一个指针,指向从 main()函数传递过来的没更改的 argv 变量。
在初始化 GLUT 后,我们开始定义我们的窗口。首先确定窗口位置(它默认的是屏幕
左上角),我们使用函数 glutInitWindowPosition()。
Void glutInitWindowPositon(int x,int y);
参数:
X: 距离屏幕左边的像素数。-1 是默认值,意思就是由窗口管理程序决定窗口出现在
哪里。如果不使用默认值,那你就自己设置一个值。
Y:距离屏幕上边的像素数。和 X 一样。
注意,参数仅仅是对窗口管理程序的一个建议。尽管你精心的设置了窗口位置,window
返回的可能是不同的位置。如果你设置了,一般会得到你想要的结果。接下来我们设置窗口
大小,使用函数 glutInitWindowSize()。
Void glutInitWindowSize(int width,int height);
参数:
Width:窗口的宽度。
Height:窗口的高度。
同样 width,height 也只是一个参考数字。避免使用负数。
接下来。你应该使用函数 glutInitDisplayMode()定义显示方式。
Void glutInitDisplayMode(unsighed int mode)
参数:
Mode――可以指定下列显示模式
Mode 参数是一个 GLUT 库里预定义的可能的布尔组合。你使用 mode 去指定颜色模式,
数量和缓冲区类型。
指定颜色模式的预定义常量有:
1:GLUT_RGBA 或者 GLUT_RGB。指定一个 RGBA 窗口,这是一个默认的颜色模式。
2:GLUT_INDEX。指定颜色索引模式。
这个显示模式还允许你选择单缓冲区或双缓冲区窗口。
1:GLUT_SINGLE.单缓冲区窗口。
2:GLUT_BUFFER.双缓冲区窗口,这是产生流畅动画必须选的。
还可以指定更多,如果你想指定一组特殊的缓冲的话,用下面的变量:
1:GLUT_ACCUM.累积缓冲区。
2:GLUT_STENCIL.模板缓冲区。
3:GLUT_DEPTH.深度缓冲区。
假定你想要一个有单缓冲区,深度缓冲区的 RGB 窗口,你用“或“(|)操作符来建立你想要
的显示模式。
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE|GLUT_DEPTH);
经过上面的这些步骤后,就可以调用函数 glutCreateWindow()来创建窗口了。
Int glutCreateWindow(char* title);
参数:
Title:设置窗口的标题。
glutCreateWindow()的返回值是一个窗口标识符。后面你可以在 GLUT 里使用这个标
识符,不过这个超出了本小节的范围。
现在就有一些代码来完成所有的初始化操作。
#include<gl/glut.h>
void main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow(“GLUT Tutorial”);
}
如果你运行上述代码,你将会得到一个空的黑的控制台窗口,而没有 OpenGL 窗口。并
且控制台窗口将很快消失。
在我们渲染一些东西前,还有两件事需要处理。第一告诉 GLUT 哪个函数负责渲染。
我们创建一个简单的渲染的函数。下面的这个函数将会清除颜色缓冲区并画一个三角形。
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glFlush();
}
上面的函数的名字你可以自己取一个。现在你必须告诉 GLUT 使用我们上面的函数来
进行渲染。这个叫寄存回调。让我们告诉 GLUT 这个函数 renderScene 应该被使用。当需要
重画的时候 GLUT 有一个只传递一个函数名称参数的函数(以函数名为形参的函数)就会
被调用。
void glutDisplayFunc(void (*func)(void));
参数:
func: 当窗口需要被重绘是调用的函数的名称。注意使用 NULL 作为实参是错误的。
最后一件事是告诉 GLUT 我们准备进入应用程序事件处理循环。GLUT 提供了一个函
数让程序进入一个永不结束的循环。一直等待处理下一个事件。函数是 glutMainLoop()。
void glutMainLoop(void)
到目前为止所有的代码都列在下面。如果你运行代码,将会得到一个控制台窗口,和一
个画着一个白色三角形的 OpenGL 窗口,出现在你设置的位置,并有着你设置的尺寸。
#include <GL/glut.h>
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glFlush();
}
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("3D Tech- GLUT Tutorial");
glutDisplayFunc(renderScene);
glutMainLoop();
}
GLUT教程(三) GLUT窗口设置
下载下面的VC工程并运行它(glut0.zip)(这个就是上一节的工程)。你将看到两个窗口:
一个控制台窗口,一个OpenGL窗口。现在改变窗口大小使高度与宽度不再相等,这时三角
形发生变形。这会发生是因为你没有正确设置投影矩阵。默认的是透视投影矩阵且高宽比为
1.因此高宽比改变了,投影就会变形。因此只要高宽比改变了,投影就应该重新计算。
GLUT 定义了当窗口大小改变时哪一个函数应该被调用。此外,这个函数还会在窗口初
次被创建时调用,保证初始化窗口不是正方形的时候渲染也不会变形出错。
这个函数是 glutReshapeFunc()。
void glutReshapeFunc(void(*func)(int width,int height));
参数:
func: 指负责设置正确投影的函数的名称。
因此我们必须做的第一件事是回到 main ()函数。在上一章的代码里加入对
glutReshapeFunc()的调用,让我们把负责窗口尺寸的函数叫做 changeSize。现在的代码如下。
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("3D Tech- GLUT Tutorial");
glutDisplayFunc(renderScene);
// Here is our new entry in the main function
glutReshapeFunc(changeSize);
glutMainLoop();
}
下面我们需要做的就是定义函数 changeSize()。从 glutReshapeFunc()函数的声明可
以看到,changSize()函数有两个形参。。这两个参数代表新的窗口高度和宽度。
void changeSize(int w, int h) {
// 防止除数即高度为 0
// (你可以设置窗口宽度为 0).
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
// 单位化投影矩阵。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 设置视口大小为增个窗口大小
glViewport(0, 0, w, h);
// 设置正确的投影矩阵
gluPerspective(45,ratio,1,1000);
//下面是设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0,0.0f,1.0f,0.0f);
}
我们在上一小段代码里引进了一些函数。下面让我们详细讲解,以免让你感到很迷茫。
第一步是计算高宽比(wight/height)。注意为了计算正确,我们必须保证高度不为 0。
接着,我们设置当前矩阵为投影矩阵,这个矩阵定义了一个可视空间(viewing volume)。
我们调用一个单位矩阵来初始化投影矩阵。然后我们用函数 glViewport 把视口设置为整个窗
口。你也可以设置不同的值。函数中(0,0)指定了视口的左下角,(w,h)指定了视口矩形
剩余28页未读,继续阅读
资源评论
ddweidong
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功