Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413533
  • 博文数量: 68
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 728
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-14 00:19
文章分类

全部博文(68)

文章存档

2011年(1)

2009年(1)

2008年(17)

2007年(30)

2006年(19)

我的朋友

分类:

2008-08-16 13:38:55

默认已经安装好一切东西了!!!

设置Visual C/C++ 6.0

Visual C/C++的工程有两个重要选项: Console (控制台) 和 Win32. 应用程序将会有两个窗口: 一个控制台窗口, 以及一个 OpenGL 窗口. 选择 Win32 仍然可以让你在不需要关心Windows程序设计的情况下编写 GLUT 程序. 你需要做以下设置:
  • 选择 Project  settings
  • 选择 Link 选项卡
  • Category 中选择 Output
  • Entry-point synmbol 文本框中键入 mainCRTStartup
对于已存在的控制台工程, 有一个简单的办法将它转换成Win32应用程序:
  • 根据上面的步骤修改入口点
  • Project options 文本框中用 subsystem:windows 覆盖 subsystem:console
或者你可以直接在你的源代码开头处添加:

// #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

注意: 这是一行注释

如此一来, 应用程序就不会出现控制台窗口, 而只是一个 OpenGL 窗口了. 在Visual C/C++ 中你需要一下步骤来连接一个 GLUT 程序:
  • 选择 Proejct/Settings
  • 选择 LINK 选项卡
  • 添加一下文件到 Object/library: opengl32.lib glut32.lib glu32.lib
请注意: 我同时添加了glu32.lib 和 opengl32.lib. 他们是标准OpenGL库.

好的,现在一切准备就绪, 我们可以开始编写 GLUT 应用程序了.

建造应用程序的主函数(main function). 主函数将会将会完成程序的初始化并启动事件处理循环. 所有函数都有一个前缀 glut , 初始化函数的前缀是 glutInit. 我们首先必须调用函数 glutInit.


void glutInit(int *argc, char **argv);
//参数:
//argc - 一个指向主函数 argc 变量的 未经修改 的指针.
//argv - 一个指向主函数 argv 变量的 未经修改 的指针.



初始化 GLUT 本身以后, 我们将会定义我们的窗口. 首先, 我们建立窗口的位置, 例如: 在窗口的左上角. 要实现这个功能, 我们需要调用函数 glutWindowsPosition.


void glutInitWindowPosition(int x, int y);
//参数:
//x- 距离屏幕左边的像素数. 默认值是 -1, 由Windows系统决定窗口的位置. 如果没有没有采用默认值, 那么你应该使用一个合适正值作为实参.
//y- 距离屏幕屏幕顶端的像素数, 其余同上.



请注意, 这些参数只是给窗口管理器的一个建议值. 我们创建的窗口可能会处于不同的位置上, 不过这很少发生. 接下来我们要决定窗口的大小, 为了做到这一点, 我们需要使用函数 glutInitWindowSize.

void glutInitWindowSize(int width, int height);
参数:
width - 窗口的宽度
height - 窗口的高度



同样的, 高和宽也只是一个建议值, 请避免使用负值.
然后我们需要定义显示模式, 我们使用 glutInitDisplayMode 函数.

void glutInitDisplayMode(unsigned int mode)
参数:
mode - 指定显示模式


mode 参数是一个 GLUT 预定义常数的复合布尔型 (位或). 你可以使用 mode 来指定颜色, 以及缓冲区的数量和类型.

这些常数是:
  • GLUT_RGBA or GLUT_RGB - 默认颜色模式
  • GLUT_INDEX - 颜色索引(?) 模式
显示模式允许你选择单或双缓冲区窗口. 相关常数是:
  • GLUT_SINGLE - 单缓冲区窗口
  • GLUT_DOUBLE - 双缓冲区, 平滑动画需要
这里还有更多关于缓冲区的常数:
  • GLUT_ACCUM - 聚集缓冲区
  • GLUT_STENCIL - The stencil buffer (...翻译不出来)
  • GLUT_DEPTH - 深度缓冲区
现在, 假如你想要创建一个RGB窗口, 单缓冲以及一个深度缓冲区. 你需要把相关的常数去 OR 在一起来创建一个正确的常口

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT DEPTH);



经过以上步骤, 我们可以调用 glutCreateWindow 函数了

int glutCreateWindow(char *title);
参数:
title - 窗口标题


glutCreateWindows 函数的返回值是索创建窗口的标示符. 你以后会用到这个标示符.
现在, 我们把上面的代码集合起来, 看看一次完整的窗口初始化:

#include

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");
}



请注意包含文件, 我们需要 GLUT 的包含文件.
如果你运行了这段代码, 那么你将看到一个黑色的控制台窗口, 但是没有任何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 来使用这个函数进行渲染. 这叫做 注册回叫(callback) 函数. GLUT 将会在需要渲染的时候呼叫这个函数. 现在我们来告诉 GLUT 一旦我们的窗口被破坏(注意: 当窗口第一次被创建的时候, 这个函数也会被呼叫)
, 就调用renderScene函数. GLUT 中有一个函数接受一个函数指针作为参数, 它将这个指针指向的函数作为渲染函数.

void glutDisplayFunc(void (*func)(void));
参数:
func - 渲染函数指针, NULL在这里非法


我们最后要做, 就是让程序进入事件处理循环. GLUT 给我们准备了一个函数来使程序进入一个无限循环(死循环), 永远在等待下一个需要处理的事件. 这个函数就是:

void glutMainLoop(void) 


以下是完整的代码. 我们添加了一个新的包含文件, 以便于我们使用OpenGL的函数, 比如 glClear, glBegin, glVertex3f 和 glEnd.
如果你运行这个代码, 你将会看到一个控制台窗口, 然后是一个画有白色三角形OpenGL窗口


#include <gl/glut.h>
#include<gl/gl.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();
}


。。。
阅读(9113) | 评论(1) | 转发(0) |
0

上一篇:N皇后问题公式解!!!

下一篇:走天涯

给主人留下些什么吧!~~

chinaunix网友2008-09-26 17:21:20

glutInit(&argc, argv);可否解释其什么作用。谢