OpenGL是一個底層圖形庫規範。它爲程序員提供了一個小的幾何圖元(點、線、多邊形、圖片和位圖)庫和一個支持2D/3D幾何對象繪圖命令庫,經過所提供的圖元和命令來控制對象的呈現(繪圖)。html
因爲OpenGL的繪圖命令僅限於畫一些簡單的幾何圖元(如點、線和多邊形),因此OpenGL實用工具包(GLUT)應運而生,它可以幫助繪畫出更復雜的三維對象(好比球體、圓環甚至茶壺)。若是你要構建須要利用到OpenGL所有特性的應用的話,GLUT未必適合,可是對剛學習OpenGL的人來講GLUT就很是有用。程序員
GLUT是爲知足windows系統下OpenGL程序獨立編程接口的需求而設計的,接口被設計的很是簡單而又實用。從OpenGL中移除windows系統的操做是一個很是英明的決定,由於這意味着OpenGL圖形系統可以被應用於更普遍的系統中(包括功能強大但昂貴的圖形工做站以及須要大量圖形運算的視頻遊戲、互動電視機機頂盒和我的電腦)。編程
GLUT簡化了用OpenGL進行渲染的程序的實現。GLUT應用編程接口(API)只須要調用不多的接口就能夠用OpenGL來渲染圖形場景,而且GLUT接口所需的參數也相對較少。windows
渲染管線數組
大多數OpenGL實現都有着相似的操做順序,這一系列的操做過程叫作OpenGL渲染管線。儘管OpenGL並不嚴格要求須要按照渲染管線這一順序來實現,可是這樣作能夠爲預測OpenGL下一步將要作什麼提供可靠的指引。幾何數據(點、線、多邊形)將會沿着一條依次經過求值器、頂點操做和裝配階段的路徑進行傳遞,而像素數據(像素,圖形,位圖)將會沿着另外一條路徑傳遞,在最終像素寫入幀緩衝區前,像素數據和幾何數據都會經歷相同的最後一步——柵格化處理。緩存
Display Lists: 全部數據,不管是用來描述幾何體仍是像素的,均可以保存在一個display list中來在當下或未來使用(用以替代display list的用法是在須要時當即處理數據——稱爲當即模式)當一個display list被觸發時,保存的數據就像當即模式同樣被髮送至顯示器。函數
Evaluators: 全部幾何原語最終都是由頂點描述的,但evaluator提供了一種用控制點表示面的方法。這種方法是擬合多項式,能夠經過控制點提供面法線、顏色、和空間紋理座標。工具
基於頂點和圖元的裝配:對於頂點的數據,下一步就是將它們轉換成圖元。某些類型的頂點數據被轉換爲4x4的浮點型矩陣。空間座標從三維世界中的一個位置被投影到您顯示屏上的一個位置。在某些情形中,這一步以後會進行透視除法,利用它可以使遠處的幾何物體看起來比近處的物體小。而後,咱們再對數據進行視口和景深的操做。至此,咱們獲得的結果是幾何圖元,這些圖元與相關的顏色值和景深值,以及光柵化步驟的指標等一同進行轉換。學習
像素操做:在幾何數據經過OpenGL渲染管線的一條路徑的同時,像素數據則經過了另一條路徑。系統內存中的一個數組中的像素首先被解壓,從若干格式中的一種轉換成擁有恰當數目的份量的那種。而後,咱們對數據進行尺度放縮,偏移,再根據像素映射處理,隨後這些結果被髮送至光柵化步驟。lua
光柵化:光柵化是指將幾何數據和像素數據都轉換成片斷的過程。各方形片斷對應幀緩存中的一個像素。當頂點被鏈接起來造成直線,或者計算填充的多邊形的內部像素時,直線的寬度,點的大小,着色模型,以及用以支持抗鋸齒的覆蓋計算等都被考慮在內。顏色值和深度值被賦予各方形片斷。而後,處理後的片斷被存入合適的緩存中,在那裏,它最終被轉化成一個像素,從而完成了它的最終使命。
OpenGL提供了一組強大但原始的渲染命令,並且全部的高層繪製都必須經過這些命令來完成。有若干庫文件可以簡化您的編程任務,包括:
包含文件
對於全部OpenGL應用程序,你都須要在全部文件中包含gl.h。幾乎全部OpenGL應用程序使用GLU,即上文提到的OpenGL實用庫(OpenGL Utility Library),它也須要包含gl.h才能使用。因此幾乎全部OpenGL源文件這樣開頭:
1
2
|
#include <GL/gl.h>
#include <GL/glu.h>
|
若是你用OpenGL 實用工具集(OpenGL Utility Toolkit,即GLUT)來管理窗體事務,你須要包含:
1
|
#include <GL/glut.h>
|
記住glut.h保證會正確包含gl.h和glut.h,因此把三個文件全包含是畫蛇添足。爲使你的GLUT程序通用性更佳,包含glut.h而 不要明確包含gl.h或glu.h。
Makefile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# insert the name of your source file here (omit the .c)
TARGET = progname
LIBS = -lglut -lGLU -lGL -lXmu -lXext -lXi -lX11 -lm
CC = /usr/gnu/bin/gcc
default
: $(TARGET)
all:
default
.c.o:
$(CC) -c $<
$(TARGET): $$@.o
$(CC) $@.o -Wall $(LIBS) -o $@
clean:
-rm -f *.o $(TARGET)
|