[譯]學習現代OpenGL

一個關於現代 OpenGL 和它爲何給咱們帶來了這麼多價值的小引導。javascript

介紹

好的,既然你想學OpenGL,很是棒,可是你知道它是什麼,你又有哪些可行的方法麼?你是否有必要去買那些昂貴的專業書籍或者網上的基本教程就已經足夠了?java

在本文中,我會嘗試回答上面一些問題並帶領你們看看OpenGL創造的精彩世界。程序員

讓咱們開始吧。web

爲何是現代

我想回答的第一個問題是我爲何稱它爲現代OpenGL,難道也有古代OpenGL麼?編程

現代OpenGL是用的"可編程式圖形管線",以前則是用的"固定管線"。緩存

它們有什麼不一樣呢?這個問題很廣,我認爲能夠這樣解釋,固定管線就像一個黑盒,你輸入頂點數據,最終得到三角形寫入到幀緩存中。你固然能夠用這個黑盒來解決你的需求,可是某些方面,它仍是不夠的。框架

可編程管線更像是一個白盒,它是透明的,並非你輸入數據以後就等待輸出結果的,你一樣能夠操做它的內部渲染機制的。它有一個大致的結構,可是其中不少部分你是徹底能夠控制的--這得要感謝shaders編程語言

shader能夠處理不少事情,而且是運行在GPU上的。它能夠轉換頂點,計算片斷的顏色,刪除或增長三角形等等...學習

爲了舉例說明這2種管線,我準備了2張圖。網站

alt text
這是固定管線

alt text
可編程管線

儘管上面的圖片很是很是簡單,他們仍然展現出可編程管線擴展性更好,程序員也能更好的控制它。這都要感謝shaders,咱們能夠用它去創造固定管線所不能達到的效果。

目前,咱們用最新發布版的圖形API(好比OpenGL或者DirectX),能夠愈來愈多的控制GPU。咱們看一下如今的遊戲引擎,很大一部分都是徹底在GPU上運行。因而咱們更有必要去學習這種現代的渲染方式。

你應該學什麼

我建議從下面這些主題開始:

  • 計算機圖形學的基礎知識
  • 平臺的區別(PC vs Mobile vs Web vs Console)
  • 圖形管線。
  • 3D方面的數學知識 -- 矩陣,向量,投影。
  • 攝像機模塊。
  • Shaders(Vertex and Fragment)
  • 紋理(Texture)
  • 緩衝區基礎(Basics of Buffers)
  • 光照基礎。

而後:

  • Shaders (Geometry, Tessellation, Compute)
  • 緩衝區的內存管理。
  • 陰影(Shadows)
  • Global Illumination
  • GPU上的基本計算。
  • ...

我故意把第二章表單留了白,當你完成上面這些部分,你會對你想達到的層次有更加清晰的願景而且知道怎麼去作了。

只能選擇C++麼

就像你注意到的,不少書籍和網站上的程序都以C++來編寫範例程序。看起來C++像是這個領域最合適的選擇。可是若是你懂其餘的語言,一樣沒問題。
OpenGL只是一系列的API,而且有不少語言都有bingdings.
因此:

  • 對於Java,參考:Java™ Binding for the OpenGL® API 或者 LWJGL
  • minecraft用的就是LWJGL
  • 不少Android應用使用的基於Java的sdk就是用的OpenGL來渲染圖形。
  • 手機開發(HTML也同樣)中,能夠關注下libgdx -- 它是基於OpenGL2.0和3.0的跨平臺遊戲和可視化開發框架。使用語言:Java。
  • 使用C#(或者VB) -- .net平臺 -- openTK
  • 使用javascript,能夠用WebGL
  • 其餘語言,能夠參考這裏:opengl wiki pages

值得注意的是,無論你選擇什麼編程語言,圖形學的原理都是同樣的。因此只要你知道用一種語言怎麼去實現某種特效,那麼就能夠相對簡單的用不一樣語言實現它。

資料和連接

結論

在本文中,我企圖給大家更多的資源讓你們在圖形編程中能有更好的進步。OpenGL如今是很是流行的技術了。你如今能夠用現代OpenGL的更好的API體驗來作出更酷的東西來。

若是還想了解關於圖形編程的知識,能夠瀏覽本文做者的blog:http://www.bfilipek.com/

感謝原文做者奉獻:原文連接

相關文章
相關標籤/搜索