OpenGL ES3.0程式設計指南讀書筆記(一):第一章 OpenGL ES 3.0簡介
簡介
OpenGL ES支援平臺包括 iOS、安卓、黑莓、bada、Linux、Windows。它還是WebGL的基礎。
工作組使用如下標準定義OpenGL ES規範:
1.從OpenGL中刪除冗餘部分
2.與OpenGL相容
3.引入手持裝置的新功能
4.確保手持裝置的影象質量
5.滿足影象質量、正確性、穩定性的相容性測試
OpenGL ES 3.0圖形管線
頂點著色器
輸入包括:
1.著色器程式
2.頂點資料
3.uniform變數
4.取樣器sampler,紋理圖片用
每個片段的輸入都用頂點著色器結果的 插值 結果
圖元裝配(這部分中文版翻譯的很奇怪)
圖元(primitive)是三角形、直線或者點精靈(這個翻譯的感覺有點奇怪,原文為point-sprite)等幾何物件。
進行視椎體裁剪(clipping),圖元在視椎體外被丟棄。裁剪後,頂點位置轉換為螢幕座標。之後進行culling,背面剔除,如果圖元朝向背面,就被剔除。裁剪和剔除後,進入光柵化(原文:A culling operation can also be performed that
discards primitives based on whether they face forward or backward. After
clipping and culling, the primitive is ready to be passed to the next stage of
the pipeline, which is the rasterization stage. )
光柵化
此階段繪製對應的圖元。光柵化是將圖元轉化為一組2D片段的過程。之後,這些片段由片段著色器處理
片段著色器
輸入包括:
1.著色器程式
2.頂點著色器的輸出
3.uniform變數
4.取樣器sampler,紋理圖片用
片段著色器中可以拋棄片段(discard)
片段著色器的著色結果被稱為gl_FragColor
逐片段操作
片段著色器著色結果覆蓋到對應螢幕座標的幀緩衝中
1.Pixel Ownership Test:測試幀緩衝中當前畫素是不是屬於OpenGL ES,如果幀緩衝區視窗被另一個視窗擋住,被擋住的畫素就會不屬於 OpenGL ES上下文,這部分在OpenGL ES內部處理
2.Scissor test:在scissor區域之外就被拋棄,The scissor test determines if (xw, yw) lies within the scissor rectangle defined as part of the OpenGL ES state,在scissor區域之內為 OpenGL ES 狀態的一部分
3.模板和深度測試:決定片段是否應該被拒絕
4.Blending:新生成的片段顏色值與緩衝區對應位置的顏色混合(半透明混合?全透明直接覆蓋?)
5.Dithering:Dithering can be used to minimize the artifacts that can occur from using limited precision to store color values in the framebuffer. 利用幀緩衝的有限精度,減少畫面中粗糙的地方(噪點,鋸齒啥的artifacts ,中文版翻譯成偽像什麼鬼)
在3.0中 alpha test可以在片段著色其中進行(因為片段著色器可能discard片段),2.0和1.x中都在逐片段操作中。
OpenGL ES 3.0新功能
此部分單獨寫文章說明
EGL
EGL是Khronos渲染API(比如OpenGL ES)和原聲視窗之間的介面
OpenGL ES開始渲染之前使用EGL做下面的事情:
1.查詢並初始化裝置可用的顯示器
2.建立渲染表面: Surfaces created in EGL can be categorized as on-screen surfaces or off-screen surfaces. On-screen surfaces are attached to the native window system, whereas off-screen surfaces are pixel buffers that do not get displayed but can be used as rendering surfaces. These surfaces can be used to render into a texture and can be shared across multiple Khronos APIs
3.建立渲染上下文
錯誤處理&狀態管理
GLenum glGetError (void)
取一次錯誤程式碼之後會被置為沒有錯誤
GL_NO_ERROR
啟用/關閉狀態
void glEnable(GLenum cap)
void glDisable(GLenum cap)