標籤:style color 使用 strong io 檔案 資料 for
? Vertex Shader和Fragment Shader是可程式化管線。
? Vertex Array/Buffer objects:頂點資料來源,這時渲染管線的頂點輸入,通常使用Buffer objects效率更好。在今天的樣本中,簡單起見,使用的是 Vertex Array;
? Vertex Shader:頂點著色器通過可程式化的方式實現對頂點的操作,如進行座標空間轉換,計算 per-vertexcolor以及紋理座標;
? Primitive Assembly:圖元裝配,經過著色器處理之後的頂點在圖片裝配階段被裝配為基本圖元。OpenGL ES 支援三種基本圖元:點,線和三角形,它們是可被 OpenGL ES 渲染的。接著對裝配好的圖元進行裁剪(clip):保留完全在視錐體中的圖元,丟棄完全不在視錐體中的圖元,對一半在一半不在的圖元進行裁剪;接著再對在視錐體中的圖元進行剔除處理(cull):這個過程可編碼來決定是剔除正面,背面還是全部剔除。
? Rasterization:光柵化。在光柵化階段,基本圖元被轉換為二維的片元(fragment),fragment 表示可以被渲染到螢幕上的像素,它包含位置,顏色,紋理座標等資訊,這些值是由圖元的頂點資訊進行插值計算得到的。這些片元接著被送到片元著色器中處理。這是從頂點資料到可渲染在顯示裝置上的像素的質變過程。
? Fragment Shader:片元著色器通過可程式化的方式實現對片元的操作。在這一階段它接受光柵化處理之後的fragment,color,深度值,模版值作為輸入。
? Per-Fragment Operation:在這一階段對片元著色器輸出的每一個片元進行一系列測試與處理,從而決定最終用於渲染的像素。
頂點變換和光照(T&L)
在一個物體被繪製到螢幕之前,必須先計算它的光照,並且將它從3D世界轉換到螢幕二維座標系中(這兩個過程稱為光照和頂點變換,也就是T&L, Transformation & Lighting)。
? 世界變換
世界變換就是將物體頂點座標從模型空間轉換到世界空間。
平移變換
旋轉變換
繞x軸旋轉θ角
繞y軸旋轉θ角
繞z軸旋轉θ角
縮放變換
? 觀察變換
以攝像機位置為參考原點,攝像機觀察的方向為座標軸,建立的座標系稱為觀察座標系
? 投影變換
將三維物體投影到二維表面上,即投影到虛擬攝像機的膠片上,這個過程就是投影變換。以膠片中心為參考原點的空間座標系稱為投影座標系,物體在投影座標系中的座標稱為投影座標
? 視區變換
物體在投影座標系中的表示為浮點座標,通過定義螢幕顯示地區(一般為顯示視窗大小),將浮點座標轉化為像素座標的過程稱為視區變換,該像素座標值稱為螢幕座標。例如,如果定義社區大小為寬640像素,高480像素,那麼投影座標(1.0f,05.f)經過社區變換螢幕座標為(640,240),如果定義視區大小為寬1024像素,高800像素,經過社區變換螢幕座標為(1024,400)。
? 頂點著色器(VertexShader)
? Attributes:使用頂點數組封裝每個頂點的資料,一般用於每個頂點都各不相同的變數,如頂點位置、顏色等。
? Uniforms:頂點著色器使用的常量資料,不能被著色器修改,一般用於對同一組頂點組成的單個3D物體中所有頂點都相同的變數,如當前光源的位置。
? Samplers:這個是可選的,一種特殊的uniforms,表示頂點著色器使用的紋理。
? Shader program:頂點著色器的源碼或可執行檔,描述了將對頂點執行的操作。
? Varying:varying變數用於儲存頂點著色器的輸出資料,當然也儲存片元著色器的輸入資料,varying 變數最終會在光柵化處理階段被線性插值。頂點著色器如果聲明了varying 變數,它必須被傳遞到片元著色器中才能進一步傳遞到下一階段,因此頂點著色器中聲明的varying 變數都應在片元著色器中重新聲明同名同類型的 varying 變數。OpenGL ES 2.0 也規定了所有實現應該支援的最大 varying 變數個數不能少於 8 個。
圖元裝配
頂點著色器之後,渲染流水線的下一個階段是圖元裝配,圖元是一個能用opengl es繪圖命令繪製的幾何體,繪圖命令指定了一組頂點屬性,描述了圖元的幾何形狀和圖元類型。頂點著色器使用這些頂點屬性計算頂點的位置、顏色以及紋理座標,這樣才能傳到片元著色器。在圖元裝配階段,這些著色器處理過的頂點被組裝到一個個獨立的幾何圖元中,例如三角形、線、點精靈。對於每個圖元,必須確定它是否位於視椎體內(3維空間顯示在螢幕上的可見地區),如果圖元部分在視椎體中,需要進行裁剪,如果圖元全部在視椎體外,則直接丟棄圖元。裁剪之後,頂點位置轉換成了螢幕座標。背面剔除操作也會執行,它根據圖元是正面還是背面,如果是背面則丟棄該圖元。經過裁剪和背面剔除操作後,就進入渲染流水線的下一個階段:光柵化。
光柵化和像素處理
光柵化階段把圖元轉換成片元集合,之後會提交給片元著色器處理,這些片元集合表示可以被繪製到螢幕的像素。如所示:
? 片元著色器(FragmentShader)
片元著色器對片元實現了一種通用的可程式化方法,它對光柵化階段產生的每個片元進行操作
? Varying variables:頂點著色器輸出的varying變數經過光柵化插值計算後產生的作用於每個片元的值。
? Uniforms:片元著色器使用的常量資料
? Samplers:一種特殊的uniforms,表示片元著色器使用的紋理。
? Shader program:片元著色器的源碼或可執行檔,描述了將對片元I執行的操作。