1. opengl es 2.0可程式設計管道
上圖黃色部分(vertex shader和fragment shader)為此管道的可程式設計部分。整個管道包含以下兩個規範:
1) opengl es 2.0 api specification
2) opengl es shading language specification (opengl es sl)
詳細流程圖如下:
此流程把三維資料變換為可以顯示的二維資料。
2. shader(就是一段程式program)
shader是一段執行在gpu上的程式(所以shader也可以叫做program),此程式使用opengl es sl語言來編寫。它是乙個描述頂點或畫素特性的簡單程式。
2.1 pixel shader
pixel shader(畫素著色器)就是眾所周知的fragment shader,它計算每個畫素的顏色和其它屬性。它通過應用光照值、凹凸貼圖,陰影,鏡面高光,半透明等處理來計算畫素的顏色並輸出。它也可改變畫素的深度(z-buffering)或在多個渲染目標被啟用的狀態下輸出多種顏色。乙個pixel shader不能產生複雜的效果,因為它只在乙個畫素上進行操作,而不知道場景的幾何形狀。
2.2 vertex shader
對於傳送給gpu的每乙個vertex(頂點),都要執行一次vertex shader(頂點著色器)。其功能是把每個頂點在虛擬空間中的三維座標變換為可以在螢幕上顯示的二維座標,並帶有用於z-buffer的深度資訊。vertex shader可以操作的屬性有:位置、顏色、紋理座標,但是不能建立新的頂點。
vertex shader輸入資料如下:
1)attributes:通過頂點陣列(vertex arrays)提供的每個頂點資料
2)uniforms:vertex shader使用的常量資料
3)samplers:vertex shader使用的乙個表示紋理型別的uniforms,在vertex shader中是可選的
4)shader program:vertex shader程式原始碼或可執行檔案,它描述了將在頂點上執行的操作
vertex shader輸出為:varying variables(vertex shader的輸出變數,作為fragment shader的輸入。必須與fragment shader中的輸入varying一一對應。)
gl_position: 是每個點固有的varying,表示點的空間位置。
geometry shader是乙個相對新的shader型別。它在driect3d 10和opengl 3.2中開始引入,在openggl 2.0+中作為擴充套件使用。它的輸入為:點、線和三角形;其輸出為點、線帶和三角形帶。
geometry shader程式在vertex shader程式執行之後執行。
3. shading language
glsl : shading language developed for use with opengl
hlsl : shading language developed for use with the direct3d api
shading language僅適合於為gpu程式設計,程式設計工具為cg(nvidia開發),cg編譯器可以輸出direct3x或opengl shader程式。
4.shading 演算法
4.1 插值技術(可以和任何照明模型組合):
• flat shading
• gouraud shading
• phong shading
4.2 照明模型 (可以和任何插值技術組合):
• blinn–phong
• cook–torrance (microfacets)
• lambert
• minnaert
• oren–nayar (rough opaque diffuse su***ces)
• phong
• ward anisotropic
5.原語彙編(primitive assembly)
在管道(pipeline)中,執行完vertex shader之後,就執行原語彙編。乙個原語(primitive)就是乙個可以使用opengl es畫圖命令進行繪製的幾何物件。
在原語彙編階段,被vertex shader處理輸出的頂點被組合進行乙個單獨可被繪製的幾何原語(如:點、線和三角形)。然後對幾何原語執行以下兩種操作:
• clipping(裁剪): 只保留在可視空間範圍內的原語
• culling(選擇): 基於面向前或後,進行原語的選擇
在裁剪和選擇之後,其下乙個階段為進行geometry shader(如果存在)或光柵化處理。
6. 光柵(rasterization)
光柵處理的目標:把原語轉換為一系列二維fragments,這些二維fragments將被fragment shader處理,且這些二維fragments表示可被繪製在螢幕上的畫素。
對每個光柵化產生的fragment執行一次fragment shader,其輸入內容如下:
• varying variables:vertex shader的輸出,且由光柵化單元對每個fragment使用插值方法產生
• uniforms:fragment shader使用的常量資料
• samplers:乙個表示紋理的常量資料
• shader program:fragment shader程式原始碼或可執行檔案,它描述了將在fragment上執行的操作。
fragment shader要麼丟棄此fragment,要麼為此fragment產生對應的color,並儲存在gl_fragcolor中.
a fragment shader example:
precision mediump float;
varying vec4 v_color; // input vertex color from vertex shader
void
main(void)
8. per-fragment operations
在執行fragment shader之後,其下一步處理為per-fragment operation。其處理流程如下:
執行per-fragment operation的結果為此fragment被丟棄,或在framebuffer對應位置(xw,yw)寫入fragment顏色值,深度值或stencil值。
openGL ES 2 0開發流程
一 新增必須的framework 框架 opengles.frameworks和quartzcore.framework 二 修改openglview.h 引入opengl的header,建立一些後面會用到的例項變數 caeagllayer eagllayer eaglcontext context...
OpenGL ES 2 0 學習筆記 四
從零開始學opengl,這裡對學習過程作記錄,包括學習資料,內容,基本知識。學習資料 opengl es 2.0 for android,網路 內容 1 基本概念 frustum 視錐體 focal point 視點或觀察者位置 field of vision 視野 目前看起來只能理解個大概,深入理...
opengles2 0 幀快取物件(FBO
幀快取物件 fbo 主要是用於做渲染到紋理。opengles2.0渲染到紋理的方法有三種 第一,使用glcopyteximage2d或者glcopytexsubimage2d,這兩個函式,複製framebuffer中的 畫素到紋理快取裡面,但這兩個函式效能比較低下,並且要求紋理的尺寸必須小於等於 f...