歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenGL實例(1)-創建窗體

OpenGL實例(1)-創建窗體

日期:2017/3/1 9:48:16   编辑:Linux編程

首先,這是在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的縮寫了。

Copyright © Linux教程網 All Rights Reserved