android平臺下OpenGL ES 3.0從零開始

原文地址:blog.csdn.net/byhook/arti…java

OpenGL ES 3.0學習實踐

目錄

  • OpenGL ES對Android平臺的支持狀況
  • OpenGL ES 3.0概述
  • OpenGL ES 3.0圖形管線圖
  • 頂點着色器
  • 片斷着色器
  • 圖元裝配
  • 光柵化
  • 逐片斷操做
  • 虛擬機和OpenGL ES 3.0的數據傳輸

OpenGL ES對Android平臺的支持狀況

OpenGL ES當前主要版本有1.0/1.1/2.0/3.0/3.1android

OpenGL ES版本 Android版本 描述
OpenGL ES1.0 Android 1.0+ OpenGL ES 1.x是針對固定硬件管線的,Android 1.0和更高的版本支持這個API規範。
OpenGL ES2.0 Android 2.2(API 8)+ OpenGL ES 2.x是針對可編程硬件管線的,不兼容OpenGL ES 1.x,Android 2.2(API 8)和更高的版本支持這個API規範。
OpenGL ES3.0 Android 4.3(API 18)+ 向下兼容OpenGL ES 2.x,Android 4.3(API 18)及更高的版本支持這個API規範。
OpenGL ES3.1 Android 5.0 (API 21)+ 向下兼容OpenGL ES3.0/2.0,Android 5.0(API 21)和更高的版本支持這個API規範

OpenGL ES 3.0概述

OpenGL ES 3.0實現了具備可編程着色功能的圖形管線,由兩個規範組成:OpenGL ES 3.0 API 規範OpenGL ES着色語言3.0規範(OpenGL ES SL)git

OpenGL ES 3.0圖形管線圖

頂點着色器

頂點着色器實現了頂點操做的通用可編程方法,着色器(Shader)是在GPU上運行的小程序。 頂點着色器的輸入包括:github

  • 着色器程序一一描述頂點上執行操做的頂點着色器程序源代碼或者可執行文件。
  • 頂點着色器輸人(或者屬性)一一用頂點數組提供的每一個頂點的數據。
  • 統一變量(uniform)一一頂點(或者片斷)着色器使用的不變數據。
  • 採樣器一一表明頂點着色器使用紋理的特殊統一變量類型。

頂點着色器的輸入輸出模型編程

頂點着色器取得一個位置及相關的顏色數據做爲輸入屬性,用一個 4x4矩陣變換位置,並輸出變換後的位置和顏色。小程序

#version 300 es
uniform mat4 u_mvpMatrix;

int vec4 a_postion;
int vec4 a_color;

out vec4 v_color;
void main(){
	v_color = a_color;
	gl_Position = u_mvpMatrix * a_postion
}
複製代碼

片斷着色器

片斷着色器片斷着色器爲片斷上的操做實現了通用的可編程方法。 對光柵化階段生成的每一個片斷執行這個着色器,採用以下輸入:數組

  • 着色器程序——描述片斷上所執行操做的片斷着色器程序源代碼或者可執行文件。
  • 輸人變量——光姍化單元用插值爲每一個片斷生成的頂點着色器鈞出。
  • 統一變量——片斷(或者頂點)着色器使用的不變數據。
  • 採樣器——討七表片斷着色器所用紋理的特殊統一變量類型。

圖元裝配

圖元裝配頂點着色器以後, 0pennGL ES 3.0 圖形管線的下一階段就是圖元裝配。 `圖元(Primitive)是三角形、直線或者點精靈等幾何對象。圖元的每一個頂點被髮送到頂點着色器的不一樣拷貝。 在圖元裝配期間,這些頂點被組合成圖元。對於每一個圖元,必須肯定圖元是否位於視錐體(屏幕上可見的 3D 空間區域)內。若是圖元沒有徹底在視錐體內,則可能須要進行裁剪。若是圖元徹底處於該區域以外,它就會被拋棄。裁剪以後,頂點位置被轉換爲屏幕座標。也能夠執行一次淘汰操做,根據圖元面向前方或者後方拋棄它們。裁剪和淘汰以後,圖元便準備傳遞給管線的下一階段 ― 光柵化階段。post

光柵化

下一階段是光柵化,在此階段繪製對應的圖元(點精靈、直線或者三角形)。光柵化是將圖元轉化爲一組二維片斷的過程,而後,這些片斷由片斷着色器處理。這些二維片斷表明着可在屏幕上繪製的像素。學習

OpenGL ES 3.0 光柵化階段spa

逐片斷操做

片斷着色器以後,下一個階段就是逐片斷操做

OpenGL ES 數據存儲

android中的程序都是運行在虛擬機中的,而OpenGL做爲本地系統庫是運行在硬件上的,虛擬機與OpenGL數據傳輸的方式由兩種

  • 第一種:使用Java調用本地接口JNI的方式,當咱們使用GLES20包裏的方法時,內部實現其實就是調用本地方法。
  • 第二種:改變內存的分配方式,Java當中有個特殊的類(如ByteBuffer)集合,能夠直接分配本地內存塊,並把Java的數據複製到本地內存,本地內存能夠被本地環境存取,而不受垃圾回收器管控。

從虛擬機到本地環境的數據傳輸過程

項目地址: github.com/byhook/open…

參考:

《OpenGL ES 3.0 編程指南第2版》

《OpenGL ES應用開發實踐指南Android卷》

相關文章
相關標籤/搜索