------------------------------------------------------------------------------------------------------------------------編程
從如今開始,認真學習OpenGL的相關知識,把讀過的每一章都作記錄,但願能堅持到最後。緩存
------------------------------------------------------------------------------------------------------------------------網絡
我從你們所熟知的」OpenGL紅寶書「,即OpenGL編程指南第八版開始入手,該書已經結合了OpenGL4.3的新特性。架構
由於是看的是中文翻譯版本,我打算和英文原版一塊兒看,有時候確實是必須的,由於看英文更接近本質。app
------------------------------------------------------------------------------------------------------------------------編程語言
堅持每一篇都寫個例子,印象會更加深入。好了,不說廢話,開始了。ide
------------------------------------------------------------------------------------------------------------------------函數
【OpenGL背景】工具
OpenGL發展到如今,已經超過了20年的時間。做爲一個成熟而久負盛名的跨平臺的計算機圖形應用程序接口規範,學習
它已經被普遍應用於遊戲,影視,軍事,航空航天,地理,醫學,機械設計,以及各種科學數據可視化的領域。
另外,隨着網絡以及移動平臺的崛起,WebGL以及OpenGL ES的標準也逐漸深刻人心,這二者同OpenGL有着千絲萬縷的聯繫。
OpenGL幾乎支持全部現有的主流操做系統平臺,包括Windows、Mac OS X以及各類UNIX平臺。同時也能夠用於幾乎全部
主流的編程語言包括C/C++、Java、C#、VB、Python、Perl等。能夠說OpenGL無處不在。而目前流行的遊戲引擎cocos2d-x
底層的渲染便是採用了OpenGL技術,要理解以及修改引擎架構,就不可避免的要接觸OpenGL,這也是我學習的一個方向。
------------------------------------------------------------------------------------------------------------------------
【什麼是OpenGL】
OpenGL即Open Graphics Library,開放圖形庫。
OpenGL是圖形硬件的一種軟件接口(The OpenGL graphics system is a software interface to graphics hardware.),
便可以對圖形硬件設備特性進行訪問的軟件庫,方便咱們開發交互式的三維計算機圖形應用程序。
OpenGL被設計爲與硬件無關的接口,所以它是跨平臺的。那麼咱們就能夠在不考慮操做系統的前提下,實現咱們的OpenGL接口。
OpenGL自身並不包含任何執行窗口任務或者處理用戶輸入的函數,不過不要緊,咱們將會用到一個第三方跨平臺的庫
GLUT(OpenGL Utility Toolkit)來幫助咱們處理這些窗口事件,關於它的內容接下來會介紹。
另外,OpenGL也沒有提供任何用於表達三維物體模型(models of three-dimensional objects),
或者讀取圖像文件(例如JPEG文件)的操做。
取而代之,咱們須要經過一系列的幾何圖元(包括點、線、三角形以及Patch)來建立三維空間的物體。
OpenGL是採用客戶端-服務端的形式實現的,咱們本身所編寫的應用程序能夠當作客戶端,而計算機圖形硬件廠商所
提供的OpenGL實現能夠看作是服務端。(OpenGL is implemented as a client-server system,with the application
you write being considered the client, and the OpenGL implementation provided by the manufacturer
of your computer graphics hardware being the server.)
OpenGL 是基於光柵化的系統(rasterization-based system),用於生成圖像。但還有其餘方法例如光線追蹤
(ray tracing),但有可能也須要用到OpenGL來顯示圖像。
------------------------------------------------------------------------------------------------------------------------
【OpenGL程序渲染圖像主要的操做】
一、爲構建形狀(Shape)指明(Specify)來自OpenGL的幾何圖元的數據。
二、使用不一樣的着色器(Shapes)對輸入的圖元數據執行計算操做,由此來判斷它們的位置、顏色、以及其餘渲染屬性。
三、將輸入圖元的數學描述轉換爲在屏幕位置上相對應的片斷(fragments)。這個過程稱之爲光柵化(Rasterization)。
四、最後,爲每一個通過光柵化階段的片斷執行片斷着色器(fragment shader),該操做決定了片斷的最終顏色以及位置。
五、有時可能須要對每一個片斷(per-fragment)執行一些額外的操做。
例如判斷片斷產生的對象是否可見,或者將片斷的顏色和當前屏幕位置的顏色相融合。
------------------------------------------------------------------------------------------------------------------------
【理解經常使用的圖形學名詞】
渲染(Rendering):表示計算機從模型建立最終圖像的過程。
模型(Model):或者又稱爲對象,是經過幾何圖元(geometric primitives)例如點(points)、線(lines)
和三角形(triangles)來構建的。而這些幾何圖元是經過頂點(vertices)來指明的。
着色器(Shaders):它是圖形硬件設備所執行的一類特殊函數。
理解着色器的最好方法是把它看作專門爲圖形處理單元(GPU)編譯的一種小型程序。
OpenGL在其內部包含了全部的編譯器工具,能夠直接從着色器代碼建立GPU執行所需代碼。
在OpenGL中,會用到四種不一樣的着色階段(shader stages)。最經常使用的包括頂點着色器(vertex shaders)和
片斷着色器(fragment shaders)。前者用於處理頂點數據(vertex data),後者用於處理光柵化後的片斷數據。
像素(pixel):指的是顯示器上最小的可視單元。在計算機系統中存儲於幀緩存中。
幀緩存(framebuffer):由圖形硬件設備管理的一塊獨立內存區域,能夠直接映射到最終的顯示設備上。
------------------------------------------------------------------------------------------------------------------------
【關於GLUT以及GLEW】
你可能會常常在OpenGL程序代碼中看到以glut開頭的函數,他們來自第三方庫OpenGL Utility Toolkit,就是咱們所說的GLUT。
這是一個很是流行的跨平臺工具庫(cross-platform),能夠用來顯示窗口、管理用戶輸入,以及執行其餘操做。
另外Freeglut是原始OpenGL庫的一個新變種。
你也可能會看到相似glewInit()這樣的函數,它來源於OpenGL Extension Wrangler,也就是GLEW。
官網關於它的介紹以下:
The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library.
GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform.
正如上文所說的,GLEW是一個跨平臺的C++擴展庫,基於OpenGL圖形接口。GLEW能自動識別你的平臺所支持的所有OpenGL高級擴展涵數。
------------------------------------------------------------------------------------------------------------------------
看了又寫了這麼多字,想必都有點迷糊了。
接下來就應該寫寫Hello OpenGL了。
2015.06.29
廣州