首先,這是在Ubuntu下運行的程序.下載opengl圖形庫花費了不少時間.在Windows上,你更應該先下載glut,然後解壓出glut.h,glut.dll,glut32.dll放在相應的文件夾內,或者你保證他們每次和你寫的opengl文件放在同一個位置。
我覺得學什麼都要運用,否則太困難了,今天先寫一個OpenGL入門級的小程序.
我們新建一個simple.c
#include <GL/glut.h>
#include <stdio.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
// glClearColor//清除顏色
glBegin(GL_POLYGON);
glVertex2f(-0.5,-0.5);
glVertex2f(-0.5,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,-0.5);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutCreateWindow("Hello,world!");
glutDisplayFunc(display);//glutDisplayFunc(void (*func)(void))
glutMainLoop();//導致程序進入一個事件
}
保存,緊接著我們在相應的目錄下:
gcc -g simple.c -o simple -lglut -lGL
你會發現後面多了兩個-l參數,他們正是opengl的核心.glut[OpenGL Utility Toolki]是一個適用於所有現代視窗系統的函數庫,GL是OpenGl的基礎
前提:你要安裝opengl圖形庫.
然後我們這樣
./simple
就是這樣子,一開始我以為opengl和Turbo圖形庫沒有太大的區別,稍後我會把自己的想法駁倒.
先初步講一下這段程序的結構,它是以後大型opengl程序的基礎,其中的內容也是比較多的.
1.一個main()函數,它負責初始化glut.
2.一個init()函數,它設置初始量.
3.一個顯示回調函數display().
4.負責處理輸入和窗口事件的其他回調函數.
這些是什麼東西啊,說實在的,我現在也是不太理解,在我沒找到它的樂趣之前,我只能通過這種方式推動自己的學習啊
還是具體看代碼吧,我就說我知道的吧!莫見怪啊.
頭文件<GL/glut.h>和下面連接的庫遙相呼應,呵呵,其中glut.h中包含#include<GL/gl.h>和#include<GL/glu.h>這樣子就把opengl的所有頭文件包括進來了.gl是opengl核心庫,它包含了所有必要的opengl函數;glu[OpenGL Utility Library]是OpenGL工具庫,其中包含了用核心庫的函數編寫的擴展函數.核心庫的函數名以gl開頭,比如glClear(),而工具庫以glu開頭,比如...好吧,暫時沒有.那麼,以glut開頭的函數你能想到什麼呢?
還有,函數的命名真的很有特點.
void glutInit(int *char, char **argu)
負責初始化GLUT ,應在其他glut函數和OpenGL函數調用之前調用.它從主函數獲取參數.
int glutCreateWindows(char *title)
負責創建一個窗口,並賦予其窗口標題,上面的例子就是hello,world.
glutDisplayFunc(void (*func)(void))
從字面上也能理解它是在回調一個名為func的函數.
void glutMainLoop()
它應該是main()函數的最後一個函數.
而整個display()函數就是在描繪一個矩形
void glClear(GL_COLOR_BUFFER_BIT)
還有
void glFlush()
是一對必不可少的語句,我不懂什麼緩存,幀緩存,請注意他們的位置.
glBegin(GL_POLYGON) and glEnd()
是定義一個圖元(opengl中有三類基本的幾何圖元:點(GL_POINTS),線段(GL_LINES)和多邊形(GL_POLYGON))的起點和終點,也是成對出現的.
glVertex2f(-0.5,-0.5)的原型是
void glVertex{234}{sifd}(x軸,y軸...)
定義了頂點,允許你使用glVertex*()函數的各個變體定義二維還是三維的甚至更高的維度,sifd是類型了分別是short,int,float,double的縮寫了。