OpenGL 簡介

oschina發表於2013-08-19

  OpenGL是一個底層圖形庫規範。它為程式設計師提供了一個小的幾何圖元(點、線、多邊形、圖片和點陣圖)庫和一個支援2D/3D幾何物件繪圖命令庫,通過所提供的圖元和命令來控制物件的呈現(繪圖)。

  由於OpenGL的繪圖命令僅限於畫一些簡單的幾何圖元(如點、線和多邊形),所以OpenGL實用工具包(GLUT)應運而生,它能夠幫助繪畫出更復雜的三維物件(比如球體、圓環甚至茶壺)。如果你要構建需要利用到OpenGL全部特性的應用的話,GLUT未必適合,但是對剛學習OpenGL的人來說GLUT就非常有用。

  GLUT是為滿足windows系統下OpenGL程式獨立程式設計介面的需求而設計的,介面被設計的非常簡單而又實用。OpenGL中移除windows系統的操作是一個非常英明的決定,因為這意味著OpenGL圖形系統能夠被應用於更廣泛的系統中(包括功能強大但昂貴的圖形工作站以及需要大量圖形運算的視訊遊戲、互動電視機機頂盒和個人電腦)。

  GLUT簡化了用OpenGL進行渲染的程式的實現。GLUT應用程式設計介面(API)只需要呼叫很少的介面就可以用OpenGL來渲染圖形場景,並且GLUT介面所需的引數也相對較少。

  渲染管線

  大多數OpenGL實現都有著類似的操作順序,這一系列的操作過程叫做OpenGL渲染管線。儘管OpenGL並不嚴格要求需要按照渲染管線這一順序來實現,但是這樣做可以為預測OpenGL下一步將要做什麼提供可靠的指引。幾何資料(點、線、多邊形)將會沿著一條依次通過求值器、頂點操作和裝配階段的路徑進行傳遞,而畫素資料(畫素,圖形,點陣圖)將會沿著另一條路徑傳遞,在最終畫素寫入幀緩衝區前,畫素資料和幾何資料都會經歷相同的最後一步——柵格化處理。

  Display Lists: 所有資料,無論是用來描述幾何體還是畫素的,都可以儲存在一個display list中來在當下或將來使用(用以替代display list的用法是在需要時立即處理資料——稱為立即模式)當一個display list被觸發時,儲存的資料就像立即模式一樣被髮送至顯示器。

  Evaluators: 所有幾何原語最終都是由頂點描述的,但evaluator提供了一種用控制點表示面的方法。這種方法是擬合多項式,可以通過控制點提供面法線、顏色、和空間紋理座標。

  基於頂點和圖元的裝配:對於頂點的資料,下一步就是將它們轉換成圖元。某些型別的頂點資料被轉換為4x4的浮點型矩陣。空間座標從三維世界中的一個位置被投影到您螢幕上的一個位置。在某些情形中,這一步之後會進行透視除法,利用它能夠使遠處的幾何物體看起來比近處的物體小。然後,我們再對資料進行視口和景深的操作。至此,我們得到的結果是幾何圖元,這些圖元與相關的顏色值和景深值,以及光柵化步驟的指標等一同進行轉換。

  畫素操作:在幾何資料通過OpenGL渲染管線的一條路徑的同時,畫素資料則通過了另外一條路徑。系統記憶體中的一個陣列中的畫素首先被解壓,從若干格式中的一種轉換成擁有恰當數目的分量的那種。然後,我們對資料進行尺度放縮,偏移,再根據畫素對映處理,隨後這些結果被髮送至光柵化步驟。

  光柵化:光柵化是指將幾何資料和畫素資料都轉換成片段的過程。各方形片段對應幀快取中的一個畫素。當頂點被連線起來形成直線,或者計算填充的多邊形的內部畫素時,直線的寬度,點的大小,著色模型,以及用以支援抗鋸齒的覆蓋計算等都被考慮在內。顏色值和深度值被賦予各方形片段。然後,處理後的片段被存入合適的快取中,在那裡,它最終被轉化成一個畫素,從而完成了它的最終使命。

 庫檔案

  OpenGL提供了一組強大但原始的渲染命令,而且所有的高層繪製都必須通過這些命令來完成。有若干庫檔案能夠簡化您的程式設計任務,包括:

  • OpenGL Utility Library (GLU),它包含若干呼叫底層OpenGL命令的函式,這些函式能夠進行諸如為某一特定觀察方向和透視以及渲染表面設定矩陣的任務。
  • OpenGL Utility Toolkit (GLUT),它是一個視窗-系統分離的工具箱,由Mark Kilgard編寫,用於隱藏不同視窗的API所帶來的複雜性。

  包含檔案

  對於所有OpenGL應用程式,你都需要在所有檔案中包含gl.h。幾乎所有OpenGL應用程式使用GLU,即上文提到的OpenGL實用庫(OpenGL Utility Library),它也需要包含gl.h才能使用。所以幾乎所有OpenGL原始檔這樣開頭:

#include <GL/gl.h>
#include <GL/glu.h> 

  如果你用OpenGL 實用工具集(OpenGL Utility Toolkit,即GLUT)管理窗體事務,你需要包含:

#include <GL/glut.h>

  記住glut.h保證會正確包含gl.h和glut.h,所以把三個檔案全包含是多此一舉。為使你的GLUT程式通用性更佳,包含glut.h而 不要明確包含gl.h或glu.h。

 設定編譯器

  在Windows上使用MS Visual Studio C++

  安裝GLUT

  1. 如果你已經安裝了MS Visual Studio C++ 5.0或以上版本,那麼下列檔案中的大多數就已經在您的機器上了。下列的GLUT檔案需要複製到指定的路徑下。
  2. 要開始安裝:

  編譯OpenGL/GLUT程式

  1. 建立一個新專案:
    • 從選單中點選檔案 | 新建
    • 點選專案選項卡
    • 點選Win32控制檯應用程式 Console Application
    • 輸入您的專案名稱
  2. 為連結器指定要用到的庫檔案:
    • 從選單中點選專案 | 設定
    • 物件/庫模組中:輸入"opengl32.lib glu32.lib glut32.lib"
  3. 向專案中新增或建立檔案:
    • 從檔案選單中點選專案 | 向專案新增 | 檔案
    • 新增需要的程式檔案
  4. 構建並執行

  Silicon Graphics Workstation

Makefile:

# 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)

  英文來源:http://www.cs.uccs.edu/~ssemwal/introduction.html