通過 C語言編寫 GLUT 程序, 你需要以下三個文件:
GLUT.H - 你需要在你的源代碼中包含這個文件. 通常情況下, 這個文件應該放在你系統的包含目錄下的 GL 文件夾中
GLUT.LIB (SGI windows版本) 以及 glut32.lib (微軟版本) - 這個文件必須被連接到你的程序中, 確保它放在 LIB 目錄中
glut32.dll (Windows) 和 glut.dll (SGI Windows版本) - 根據你所使用的OpenGL選擇一個, 如果你正在使用微軟公司的版本, 那么你必須選擇 glut32.dll. 你應該把DLL放置在你的系統文件夾中
設置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在這里非法
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 給我們準備了一個函數來使程序進入一個無限循環(死循環), 永遠在等待下一個需要處理的事件. 這個函數就是 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的函數, 比如 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();
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
轉自:
http://blog.tianya.cn/blogger/post_show.asp?BlogID=80680&PostID=2276189&idWriter=0&Key=0出現無法解析符號:
- 1>GEARS.obj : error LNK2019: 無法解析的外部符號 ___glutInitWithExit@12,該符號在函數 _glutInit_ATEXIT_HACK@8 中被引用
- 1>GEARS.obj : error LNK2019: 無法解析的外部符號 ___glutCreateWindowWithExit@8,該符號在函數 _glutCreateWindow_ATEXIT_HACK@4 中被引
glut.h的文件內容于是,
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
風輕云淡 閱讀(1428)
評論(0) 編輯 收藏 引用 所屬分類:
OpenGL