GLUT.H - 你需要在你的源代码中包含q个文g. 通常情况? q个文g应该攑֜你系l的包含目录下的 GL 文g夹中
GLUT.LIB (SGI windows版本) 以及 glut32.lib (微Y版本) - q个文g必须被连接到你的E序? 保它放?LIB 目录?
glut32.dll (Windows) ?glut.dll (SGI Windows版本) - Ҏ你所使用的OpenGL选择一? 如果你正在用微软公司的版本, 那么你必选择 glut32.dll. 你应该把DLL攄在你的系l文件夹?br>讄Visual C/C++ 6.0
Visual C/C++的工E有两个重要选项: Console (控制? ?Win32. 应用E序会有两个窗? 一个控制台H口, 以及一?OpenGL H口. 选择 Win32 仍然可以让你在不需要关心WindowsE序设计的情况下~写 GLUT E序. 你需要做以下讄:
选择 Project -> settings
选择 Link 选项?
?Category 中选择 Output
?Entry-point synmbol 文本框中键入 mainCRTStartup
对于已存在的控制台工E? 有一个简单的办法它转换成Win32应用E序:
Ҏ上面的步骤修改入口点
?Project options 文本框中?subsystem:windows 覆盖 subsystem:console
或者你可以直接在你的源代码开头处d:
代码
// #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
注意: q是一行注释?br>如此一? 应用E序׃会出现控制台H口, 而只是一?OpenGL H口? 在Visual C/C++ 中你需要一下步骤来q接一?GLUT E序:
选择 Proejct/Settings
选择 LINK 选项?
d一下文件到 Object/library: opengl32.lib glut32.lib glu32.lib
h? 我同时添加了glu32.lib ?opengl32.lib. 他们是标准OpenGL?
好的,现在一切准备就l? 我们可以开始编?GLUT 应用E序? 如果有Q何不清楚的地? h告诉? 您的回馈非常之重?
?br>在这一节中, 我们会建造应用程序的d?main function). d数将会将会完成程序的初始化ƈ启动事g处理循环. 所有函数都有一个前~ glut , 初始化函数的前缀?glutInit. 我们首先必须调用函数 glutInit.
?br>代码
void glutInit(int *argc, char **argv);
//参数:
//argc - 一个指向主函数 argc 变量?未经修改 的指?
//argv - 一个指向主函数 argv 变量?未经修改 的指?
初始?GLUT 本n以后, 我们会定义我们的窗? 首先, 我们建立H口的位|? 例如: 在窗口的左上? 要实现这个功? 我们需要调用函?glutWindowsPosition.
代码
void glutInitWindowPosition(int x, int y);
//参数:
//x- 距离屏幕左边的像素数. 默认值是 -1, 由Windowspȝ军_H口的位|? 如果没有没有采用默认? 那么你应该用一个合适正g为实?
//y- 距离屏幕屏幕端的像素数, 其余同上.
h? q些参数只是l窗口管理器的一个徏议? 我们创徏的窗口可能会处于不同的位|上, 不过q很发? 接下来我们要军_H口的大? Z做到q一? 我们需要用函?glutInitWindowSize.
代码
void glutInitWindowSize(int width, int height);
参数:
width - H口的宽?br>height - H口的高?br>
同样? 高和宽也只是一个徏议? 请避免用负?
然后我们需要定义显C模? 我们使用 glutInitDisplayMode 函数.
代码
void glutInitDisplayMode(unsigned int mode)
参数:
mode - 指定昄模式?br>//mode 参数是一?GLUT 预定义常数的复合布尔?(位或). 你可以?mode 来指定颜? 以及~冲区的数量和类?
q些常数?
GLUT_RGBA or GLUT_RGB - 默认颜色模式
GLUT_INDEX - 颜色索引(?) 模式
昄模式允许你选择单或双缓冲区H口. 相关常数?
GLUT_SINGLE - 单缓冲区H口
GLUT_DOUBLE - 双缓冲区, qx动画需?br>
q里q有更多关于~冲区的常数:
GLUT_ACCUM - 聚集~冲?
GLUT_STENCIL - The stencil buffer (...译不出?
GLUT_DEPTH - 深度~冲?br>
现在, 假如你想要创Z个RGBH口, 单缓冲以及一个深度缓冲区. 你需要把相关的常数去 OR 在一h创徏一个正的常口
代码
...
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT DEPTH);
...?br>l过以上步骤, 我们可以调用 glutCreateWindow 函数?br>
代码
int glutCreateWindow(char *title);
参数:
title - H口标题
glutCreateWindows 函数的返回值是索创建窗口的标示W? 你以后会用到q个标示W?
现在, 我们把上面的代码集合h, 看看一ơ完整的H口初始?
代码
#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");
}
h意包含文? 我们需?GLUT 的包含文?
如果你运行了q段代码, 那么你将看到一个黑色的控制台窗? 但是没有MOpenGLH口, 几秒钟以? q个H口也消׃. 在我们开始渲染之?我们q要做两件事? 首先是告?GLUT pȝ负责渲染的函?
我们来创Z个渲染函数的例子. q个函数会清空颜色~冲? q画Z个三角Ş:
代码
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();
}
你可以给函数起Q意的名字. 然? 你必d?GLUT 来用这个函数进行渲? q叫?注册回叫(callback) 函数. GLUT 会在需要渲染的时候呼叫这个函? 现在我们来告?GLUT 一旦我们的H口被破?注意: 当窗口第一ơ被创徏的时? q个函数也会被呼?
, p用renderScene函数. GLUT 中有一个函数接受一个函数指针作为参? 它将q个指针指向的函C为渲染函?
代码
void glutDisplayFunc(void (*func)(void));
参数:
func - 渲染函数指针, NULL在这里非?
One last thing missing, that is telling GLUT that we're ready to get in the application event processing loop. GLUT provides a function that gets the application in a never ending loop, always waiting for the next event to process. The GLUT function is glutMainLoop, and the syntax is as follows:
我们最后要? 是让程序进入事件处理@? GLUT l我们准备了一个函数来使程序进入一个无限@?d@?, 永远在等待下一个需要处理的事g. q个函数是 glutMainLoop:
代码
void glutMainLoop(void)
The code so far is presented bellow. Note that we've added an include statement in order to start using standard OpenGL functions, like glClear, glBegin, glVertex3f, and glEnd.
以下是完整的代码. 我们d了一个新的包含文? 以便于我们用OpenGL的函? 比如 glClear, glBegin, glVertex3f ?glEnd.
如果你运行这你将会看C个控制台H口, 然后是一个画有白色三角ŞOpenGLH口
代码
#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();
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、?br>转自Q?a >http://blog.tianya.cn/blogger/post_show.asp?BlogID=80680&PostID=2276189&idWriter=0&Key=0
出现无法解析W号Q?br>
- 1>GEARS.obj : error LNK2019: 无法解析的外部符?nbsp;___glutInitWithExit@12Q该W号在函?nbsp;_glutInit_ATEXIT_HACK@8 中被引用
- 1>GEARS.obj : error LNK2019: 无法解析的外部符?nbsp;___glutCreateWindowWithExit@8Q该W号在函?nbsp;_glutCreateWindow_ATEXIT_HACK@4 中被?/span>
glut.h的文件内?/span>于是Q?br> Note that the __glut*WithExit routines should NEVER be called directly.
To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK.
?include <GL/glut.h>前面加上了一句:
#define GLUT_DISABLE_ATEXIT_HACK
参考GLUTAPIQ?a >http://www.opengl.org/documentation/specs/glut/spec3/spec3.html
GLUTFrame实例下蝲

]]>