學習OpenGL是學習計算機圖形學的一個工具,由於計算機上圖形的顯示要依靠底層的軟件和硬件,學習圖形學除了學習基本的概念,線,曲面,圖形生成,變換,渲染這些,作三維的圖形圖像顯示時,從操做系統和驅動這一底層設計起顯然費時不切實際,因此咱們須要一套高級的圖形接口。編程

咱們能夠認爲 Opengl 就是這樣的一個 API,OpenGL 有多種語言綁定,可是最終地最底層是一個 C 語言的 API接口。這組 API由一些 typedef,#define 和enumerator 值和函數(function)組成,typedef 定義了 GL 的基本類型,如 GLint,GLfloat。可是複雜的類型如結構沒有直接在 OpenGL 顯示出來。架構

在 C++中,若是一個對象包括一個整數,一個浮點數和一個字符串時,通常你會這樣建立並讀取它們:框架

struct Object{ int count; float opacity; char *name }; Object newObject; newObject.count = 5; newObject.opacity = 0.4f; newObject.name = "some string"; 

在 OpenGL 中,通常你會這樣用 API:函數

GLuint objectName; glGenObject(1, &objectName); glBindObject(GL_MODIFY, objectName); glObjectParameteri(GL_MODIFY, GL_OBJECT_COUNT, 5); glObjectParameterf(GL_MODIFY, GL_OBJECT_OPACITY, 0.4f); glObjectParameters(GL_MODIFY, GL_OBJECT_NAME, "Some String"); 

:以上只是一個例子說明API 的接口對象有什麼不一樣,不是真實的 OpenGL 函數。工具

OpenGL 規範post

從技術的意義上來講,OpenGL 不是一個 API,而是一種規範,一個文件。咱們所說的 C API 只是它的一個實現。規範定義了 OpenGL 的初始狀態,什麼樣的函數不改變他的狀態,調用渲染的函數時會發生什麼這些。學習

這個規範是 OpenGL Architectural Review Board(ARB)寫的,這個組織由 Apple,Nvidia,AMD(ATI part)等公司的人員組成,這個組織,也是 Khronos Group 的一部分。這個是複雜並且十分技術性的,固然你也能夠去閱讀他,須要注意的是,這個規範只規定告終果,而不是實現過程,是面對用戶來講的,不論硬件的供應商如何實現 OpenGL,用戶應該不能分辨出不一樣。因此說,儘管 ARB 組織管理着 OpenGL 規範,但不控制 OpenGL 的代碼,在一個硬件上如何用代碼實現是由供應商的開發者決定的。OpenGL 在不一樣的操做系統上實現也不相同,在 Windows 上,這些實現是由硬件製造商實際控制的,但在 Mac OSX 上大部分由 Apple實現,硬件供應商開發內部的驅動,Linux 上則更爲複雜。。。(如 Mesa 3D 就是 OpenGL 的開源軟件實現)總的來講,OpenGL 實現由軟件操做系統和硬件製造商共同協商實現。網站

OpenGL 版本ui

OpenGl 的實現有不少版本(最新的是4.4),咱們不須要對全部版本都熟悉,應該從儘量新的版本學起。OpenGL 的版本不像 Direct3D 版本,會更改大部分 API,OpenGL 大多向下兼容,可是到了 OpenGL 3.0之後,隨着圖形卡的架構發展,OpenGL的結構也發生了很大改變(可編程着色器),v3.1後移除了很大一部分函數,去除了大部分固定管線的內容,因此若是再有書上或教程上從固定管線講起,那麼它必定是過期的了。因此如今的 OpenGl分爲兩個部分(或者稱爲 profiles):core 和 compatibility,compatibility 部分仍讓向後兼容。spa

OpenGL Framework

OpenGL 是比較底層的 API,有利於咱們學習計算機圖形學,可是利用這些接口作出可與操做系統交互的程序,或者簡化咱們編程時的工做量,咱們須要一些框架工具,固然以 OpenGL 爲核心的框架不少,都包括基本的和不一樣的操做系統窗口交互,建立上下文,加載 OpenGL 函數直至面向對象的框架。這些能夠稱爲 OpenGL 的 SDK ,其中包括了不少的 Framework,詳細資料能夠查看 OpenGL 的官方網站。這些能夠由簡單或由底層到面向對象幾個層次。

  1. OpenGL 初始化工具:創建 OpenGL 上下文常常須要平臺相關的一些代碼去建立窗口,而後加載 OpenGL 函數,這些工具大大簡化了這些過程,並提供跨平臺的解決方案
  2. 上下文/窗口工具
simple window 「multimedia library」 widget toolkits
freeglut Allegro version 5 FLTK
GLFW SDL Qt
GLUT SFML wxWigets
  • OpenGL 加載函數

GlEW和 gl3w(主要集中與 OpenGL3/4 Core )

  1. 實用工具:不很是依賴 OpenGL,可是在開發 OpenGL 工具時十分有用。
  • 圖像和紋理庫
    DevIL
    FreeImage
    SOIL
    GLI
    glraw

  • 數學庫

GLM 和 TVMet

  1. 利用 OpenGL 開發的面向程序接口或者引擎,便於3D 圖形繪製。

Open Inventor,Oger3D,ClanLib 等。

在初學 OpenGL 時,通常咱們會用到 freeglut(相對簡單)、GLFW、GLEW 這幾個框架,配合 QT 開發圖形界面,或者用 SDL 作一些簡單的應用

不少書上都把 OpenGL 的 API 接口定義爲一種狀態機模型,(不過我在比較新的 OpenGL 編程模型學習中以爲這一個觀點已通過時了,可是這一句話估計在有關 OpenGL 的書上很常見,並且 OpenGL 又是向後兼容了,稱爲狀態機模型不能說錯)。因此會常常見到 OpenGL context(上下文)這一術語,context 不能簡單地歸納,從之後的學習咱們能夠了解。

原文連接:http://foryo24.farbox.com/post/opengl