2009年6月4日 星期四

Shading Language Prework - 3D Math



OpenGL 是個人在大二時接觸的, 當時也沒有特別深入
大概是瞭解OpenGL提供的座標系統, 會貼圖和使用 Display List 的程度
由於一直停留在 OpenGL 1.2 以前的印象
在剛看到OpenGL (ES) 2.x 時, 個人還深深懷疑是否真的學過OpenGL

在接觸到OpenGL ES 2.0
並且開始瞭解這幾年的GLSL到 ESSL之後
對於 OpenGL SuperBible 中的描述:
"This isn't your father's OpenGL" 不禁莞爾一笑
事隔十多年, 對於CS後進而言, 這真的不是上一輩的OpenGL

延續OpenGL ES 2.0: Hello Triangle!文章
即便有了相關的Emulator, 若非已經在Desktop上熟悉於撰寫OpenGL Shading Language
在撰寫OpenGL ES 2.0程式上應該會感到不得其門而入
這是由於 OpenGL ES 2.0 是精簡自OpenGL 2.0
已經不若 ES 1.x 採用 fixed function的方式

在OpenGL ES 1.x 中採用的 Graphics pipeline 示意圖如下

其中每個部份OpenGL 都有提供對應的 API
像是Transforming部份的 glTranslate, glRotate, glPushMatrix 和 glPopMatrix 等
如此規劃的缺點是, 所產生的效果受限於 OpenGL (ES) 1.x 內所採用對於顏色和光線的演算法
在產生的效果上受限, 對於新的演算法上實作的複雜度高和效率上的低落

然而OpenGL (ES) 1.x 也不是全然沒有好處
相較於駕馭OpenGL (ES) 2.x shading language高門檻
只要對於Coordinate和Camera View 有點瞭解, 知道所需使用的 OpenGL (ES) 1.x API
一般人無需瞭解複雜的數理運算, 就可以寫出不錯的 3D 程式

在OpenGL ES 2.0中 pipeline 如下

其中可以看出原本的 Transformation & Lighting 由 Vertex Shader 處理
在Rasterization 後的Texture, Color, Fog, Alpha都由 Fragment Shader 處理
而shader 的實作就是靠 shading language 針對此兩部份撰寫兩個程式
由於programmable 的緣故 Vertex/Fragment Shader 能提供的能力與彈性超過於上述的項目

而由於上述以shading language處理的部份功能上被取代,
在制定的 API 上相較於 ES 1.1 顯得精簡
而這些彈性與強大的功能所需付出的代價是:
由於shading language 必須直接處理幾何/光學/著色效果.
必須對於 3D 背後的數理運算有相當的認識.



在3D數理上, 其實並沒有一般人懼怕的高深,
只複習一小部份的Linear Algebra與簡單的向量/幾何運算
即可以理解與掌握絕大部分的3D 計算
想好好複習一下可以看看"3D Math Primer for Graphics and Game Development"
(對於 Shading Language 也用不到裡面全部的內容)
可惜的是, 本書運算式上以 left-handed coordinate/row vector 為主
對於OpenGL 採用的 right-handed coordinate/column vector需要稍微對應轉換一下
然而這對於概念與數理的瞭解上並不構成太多問題.

在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例

Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...