通過 C語言編寫 GLUT 程序, 你需要以下三個文件:
GLUT.H - 你需要在你的源代碼中包含這個文件. 通常情況下, 這個文件應(yīng)該放在你系統(tǒng)的包含目錄下的 GL 文件夾中
GLUT.LIB (SGI windows版本) 以及 glut32.lib (微軟版本) - 這個文件必須被連接到你的程序中, 確保它放在 LIB 目錄中
glut32.dll (Windows) 和 glut.dll (SGI Windows版本) - 根據(jù)你所使用的OpenGL選擇一個, 如果你正在使用微軟公司的版本, 那么你必須選擇 glut32.dll. 你應(yīng)該把DLL放置在你的系統(tǒng)文件夾中
設(shè)置Visual C/C++ 6.0
Visual C/C++的工程有兩個重要選項: Console (控制臺) 和 Win32. 應(yīng)用程序?qū)袃蓚€窗口: 一個控制臺窗口, 以及一個 OpenGL 窗口. 選擇 Win32 仍然可以讓你在不需要關(guān)心Windows程序設(shè)計的情況下編寫 GLUT 程序. 你需要做以下設(shè)置:
選擇 Project -> settings
選擇 Link 選項卡
從 Category 中選擇 Output
在 Entry-point synmbol 文本框中鍵入 mainCRTStartup
對于已存在的控制臺工程, 有一個簡單的辦法將它轉(zhuǎn)換成Win32應(yīng)用程序:
根據(jù)上面的步驟修改入口點
在 Project options 文本框中用 subsystem:windows 覆蓋 subsystem:console
或者你可以直接在你的源代碼開頭處添加:
代碼
// #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
注意: 這是一行注釋
如此一來, 應(yīng)用程序就不會出現(xiàn)控制臺窗口, 而只是一個 OpenGL 窗口了. 在Visual C/C++ 中你需要一下步驟來連接一個 GLUT 程序:
選擇 Proejct/Settings
選擇 LINK 選項卡
添加一下文件到 Object/library: opengl32.lib glut32.lib glu32.lib
請注意: 我同時添加了glu32.lib 和 opengl32.lib. 他們是標準OpenGL庫.
好的,現(xiàn)在一切準備就緒, 我們可以開始編寫 GLUT 應(yīng)用程序了. 如果有任何不清楚的地方, 請您告訴我, 您的回饋非常之重要.
在這一節(jié)中, 我們將會建造應(yīng)用程序的主函數(shù)(main function). 主函數(shù)將會將會完成程序的初始化并啟動事件處理循環(huán). 所有函數(shù)都有一個前綴 glut , 初始化函數(shù)的前綴是 glutInit. 我們首先必須調(diào)用函數(shù) glutInit.
代碼
void glutInit(int *argc, char **argv);
//參數(shù):
//argc - 一個指向主函數(shù) argc 變量的 未經(jīng)修改 的指針.
//argv - 一個指向主函數(shù) argv 變量的 未經(jīng)修改 的指針.
初始化 GLUT 本身以后, 我們將會定義我們的窗口. 首先, 我們建立窗口的位置, 例如: 在窗口的左上角. 要實現(xiàn)這個功能, 我們需要調(diào)用函數(shù) glutWindowsPosition.
代碼
void glutInitWindowPosition(int x, int y);
//參數(shù):
//x- 距離屏幕左邊的像素數(shù). 默認值是 -1, 由Windows系統(tǒng)決定窗口的位置. 如果沒有沒有采用默認值, 那么你應(yīng)該使用一個合適正值作為實參.
//y- 距離屏幕屏幕頂端的像素數(shù), 其余同上.
請注意, 這些參數(shù)只是給窗口管理器的一個建議值. 我們創(chuàng)建的窗口可能會處于不同的位置上, 不過這很少發(fā)生. 接下來我們要決定窗口的大小, 為了做到這一點, 我們需要使用函數(shù) glutInitWindowSize.
代碼
void glutInitWindowSize(int width, int height);
參數(shù):
width - 窗口的寬度
height - 窗口的高度
同樣的, 高和寬也只是一個建議值, 請避免使用負值.
然后我們需要定義顯示模式, 我們使用 glutInitDisplayMode 函數(shù).
代碼
void glutInitDisplayMode(unsigned int mode)
參數(shù):
mode - 指定顯示模式
//mode 參數(shù)是一個 GLUT 預(yù)定義常數(shù)的復(fù)合布爾型 (位或). 你可以使用 mode 來指定顏色, 以及緩沖區(qū)的數(shù)量和類型.
這些常數(shù)是:
GLUT_RGBA or GLUT_RGB - 默認顏色模式
GLUT_INDEX - 顏色索引(?) 模式
顯示模式允許你選擇單或雙緩沖區(qū)窗口. 相關(guān)常數(shù)是:
GLUT_SINGLE - 單緩沖區(qū)窗口
GLUT_DOUBLE - 雙緩沖區(qū), 平滑動畫需要
這里還有更多關(guān)于緩沖區(qū)的常數(shù):
GLUT_ACCUM - 聚集緩沖區(qū)
GLUT_STENCIL - The stencil buffer (...翻譯不出來)
GLUT_DEPTH - 深度緩沖區(qū)
現(xiàn)在, 假如你想要創(chuàng)建一個RGB窗口, 單緩沖以及一個深度緩沖區(qū). 你需要把相關(guān)的常數(shù)去 OR 在一起來創(chuàng)建一個正確的常口
代碼
...
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT DEPTH);
...
經(jīng)過以上步驟, 我們可以調(diào)用 glutCreateWindow 函數(shù)了
代碼
int glutCreateWindow(char *title);
參數(shù):
title - 窗口標題
glutCreateWindows 函數(shù)的返回值是索創(chuàng)建窗口的標示符. 你以后會用到這個標示符.
現(xiàn)在, 我們把上面的代碼集合起來, 看看一次完整的窗口初始化:
代碼
#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 系統(tǒng)負責渲染的函數(shù):
我們來創(chuàng)建一個渲染函數(shù)的例子. 這個函數(shù)將會清空顏色緩沖區(qū), 并畫出兩個三角形:
代碼
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();
}
你可以給函數(shù)起任意的名字. 然而, 你必須告訴 GLUT 來使用這個函數(shù)進行渲染. 這叫做 注冊回叫(callback) 函數(shù). GLUT 將會在需要渲染的時候呼叫這個函數(shù). 現(xiàn)在我們來告訴 GLUT 一旦我們的窗口被破壞(注意: 當窗口第一次被創(chuàng)建的時候, 這個函數(shù)也會被呼叫)
, 就調(diào)用renderScene函數(shù). GLUT 中有一個函數(shù)接受一個函數(shù)指針作為參數(shù), 它將這個指針指向的函數(shù)作為渲染函數(shù).
代碼
void glutDisplayFunc(void (*func)(void));
參數(shù):
func - 渲染函數(shù)指針, 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:
我們最后要做, 就是讓程序進入事件處理循環(huán). GLUT 給我們準備了一個函數(shù)來使程序進入一個無限循環(huán)(死循環(huán)), 永遠在等待下一個需要處理的事件. 這個函數(shù)就是 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.
以下是完整的代碼. 我們添加了一個新的包含文件, 以便于我們使用OpenGL的函數(shù), 比如 glClear, glBegin, glVertex3f 和 glEnd.
如果你運行這你將會看到一個控制臺窗口, 然后是一個畫有白色三角形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();
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
轉(zhuǎn)自:
http://blog.tianya.cn/blogger/post_show.asp?BlogID=80680&PostID=2276189&idWriter=0&Key=0出現(xiàn)無法解析符號:
- 1>GEARS.obj : error LNK2019: 無法解析的外部符號 ___glutInitWithExit@12,該符號在函數(shù) _glutInit_ATEXIT_HACK@8 中被引用
- 1>GEARS.obj : error LNK2019: 無法解析的外部符號 ___glutCreateWindowWithExit@8,該符號在函數(shù) _glutCreateWindow_ATEXIT_HACK@4 中被引
glut.h的文件內(nèi)容于是,
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
參考GLUTAPI:http://www.opengl.org/documentation/specs/glut/spec3/spec3.html
GLUTFrame實例下載
posted on 2010-06-19 11:11
風輕云淡 閱讀(1427)
評論(0) 編輯 收藏 引用 所屬分類:
OpenGL