獲取和安裝了OpenGL之后,就可以寫第一個OpenGL程序了。雖然Helloj2ee在獲取和安裝OpenGL非常順利。但是實際中大家會遇到不同的問題。具體說來主要有以下兩個問題。
1、按照上一篇的步驟,VS運行OpenGL程序仍然找不到glut.dll和glut32.dll。這個問題主要是操作系統不一樣。64位操作系統,需要將這兩個dll安裝到系統目錄syswow64目錄下。
2、lib放置的問題。仍然是部分機器,會存在Program File以及Program Files(x86)目錄,您的VS多半會在后一個目錄,因此需要找到相應的VS2010安裝目錄的lib文件夾下。比如Helloj2ee的機器lib的路徑是C:\Program Files\Microsoft Visual Studio 10.0\VC\lib,您也可能是C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\lib。
當然Helloj2ee還遇到了同學不知道安裝目錄到底在哪兒。呃。這Helloj2ee就無能為力,回天乏術了。
一切順利,您可以開始寫第一個OpenGL程序了,程序代碼如下圖所示。
#include <windows.h> #include <gl/Gl.h> #include <gl/glu.h> #include <gl/glut.h> //<<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>> void myInit(void) { glClearColor(0.0, 0.0, 0.0, 0.0); // 設置背景顏色為亮白 glColor3f(1.0f, 1.0f, 1.0f); // 設置繪制顏色為黑 glPointSize(4.0); //設置點的大小為4*4像素 glMatrixMode(GL_PROJECTION);// 設置合適的投影矩陣-以后解釋 glLoadIdentity();// 以后解釋 gluOrtho2D(0.0, 640.0, 0.0, 480.0);// 以后解釋 } //<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>> // 重繪函數 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); // 清屏幕 glBegin(GL_POINTS); glVertex2i(100, 50); // 繪制若干個點 glVertex2i(100, 130); glVertex2i(150, 130); glEnd(); glFlush(); // 將所有輸出到顯示屏上 } //<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>> void main(int argc, char **argv) { glutInit(&argc, argv); // 初始化工具包 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 設置顯式模式 glutInitWindowSize(640,480); // 設置窗口大小 glutInitWindowPosition(100, 150); // 設置窗口位置 glutCreateWindow("my first attempt"); // 打開屏幕窗口 glutDisplayFunc(myDisplay); // 注冊繪制函數 myInit(); glutMainLoop(); // 進入主循環 }
Helloj2ee逐一解釋一下。但凡gl開頭的函數都是opengl的gl庫,glu開頭的函數都是glu庫,glut開頭的函數都是glut庫,其他除main外,就是Helloj2ee操刀寫的函數。除去親自操刀寫的函數不解釋外,其他Helloj2ee都略做解釋。
glutInit(int *argcp, char **argv)
該函數初始化工具包,其參數是傳送有關命令行信息的標准參數。
glutInitDisplayMode(unsigned int mode)
該函數指明顯式屏幕窗口如何被初始化。內置常數GLUT_SINGLE和GLUT_RGB是或的關系,表明應分配單個顯式緩存(相對雙緩存),而且顏色所需的紅、藍、綠三色的數量來指定。
glutInitWindowSize(int width, int height)
該函數指定顯式屏幕窗口的初始尺寸,示例中寬640像素,高480像素。程序運行時,用戶可以根據需要調整窗口大小。
glutInitWindowPosition(int x, int y)
該函數指定窗口在屏幕上相對於左上角的位置,示例中距左邊100個像素,距頂端150個像素。程序運行時,用戶可以根據需要移動窗口。
glutCreateWindow(char* name)
該函數打開並顯式屏幕窗口,示例中是將標題設置為了“My First Attempt”。
glutDsiplayFunc(void (*func)(void))
無論系統何時決定重畫一個屏幕窗口,它都會發出一個重新繪制事件。出現下列情況之一,就會發生該事件:第一次打開窗口,或覆蓋它的窗口被移走而露出該窗口。示例中函數myDisplay()在這里被注冊為重新繪制事件的回調函數。
glutMainLoop()
執行這個函數時,程序繪制完初始圖形,並進入循環,一直等待事件發生。用鼠標單擊關閉窗口按鈕,程序正常終止。
glBegin(GLenum mode)和glEnd()
繪制函數應該處於這兩個函數之間,示例中GL_POINTS內置於OpenGL中。如果需要繪制點集合、線集合以及多邊形,可以傳遞GL_POINTS,GL_LINES以及GL_POLYGON等。
OpenGl函數命名非常有規則,以glvertex2i為例,gl 代表gl庫,Vertex 代表基本命令,2 參數數目,i 參數類型,OpenGL用到的參數類型如下所示。
參數類型
后綴 |
數據類型 |
典型的C或C++類型 |
OpenGL類型名 |
b |
8位整型 |
signed char |
GLbyte |
s |
16位整型 |
short |
GLshort |
i |
32位整型 |
int 或long |
GLint,GLsizei |
f |
32位浮點型 |
Float |
GLfloat,GLclampf |
d |
64位浮點型 |
double |
GLdouble,GLclampd |
ub |
8位無符號整型 |
unsigned char |
GLubyte,GLboolean |
us |
16位無符號整型 |
unsigned short |
GLushort |
ui |
32位無符號整型 |
unsigned int或unsigned long |
GLuint,GLenum,GLbitfield |