1. 程式人生 > >OpenGL ES 基礎概念介紹

OpenGL ES 基礎概念介紹

Opengl es 2.0實現了可程式設計的圖形管線,比起1.x的固定管線要複雜和靈活很多,由兩部分規範組成:Opengl es 2.0 API規範和Opengl es著色語言規範。下圖是Opengl es 2.0渲染管線,陰影部分是opengl es 2.0的可程式設計階段。

1. 頂點著色器(VertexShader) 頂點著色器對頂點實現了一種通用的可程式設計方法。 頂點著色器的輸入資料由下面組成: Attributes:使用頂點陣列封裝每個頂點的資料,一般用於每個頂點都各不相同的變數,如頂點位置、顏色等。 Uniforms:頂點著色器使用的常量資料,不能被著色器修改,一般用於對同一組頂點組成的單個3D物體中所有頂點都相同的變數,如當前光源的位置。
Samplers:這個是可選的,一種特殊的uniforms,表示頂點著色器使用的紋理。 Shader program:頂點著色器的原始碼或可執行檔案,描述了將對頂點執行的操作。 頂點著色器的輸出資料是varying變數,在圖元光柵化階段,這些varying值為每個生成的片元進行計算,並將結果作為片元著色器的輸入資料。從分配給每個頂點的原始varying值來為每個片元生成一個varying值的機制叫做插值。 頂點著色器資料的輸入和輸出可以參考下圖: 頂點著色器可用於傳統的基於頂點的操作,例如:基於矩陣變換位置,進行光照計算來生成每個頂點的顏色,生成或者變換紋理座標。 另外因為頂點著色器是由應用程式指定的,所以你可以用來進行任意自定義的頂點變換。

下面是一個用opengl es著色器語言編寫的頂點著色器原始碼,這個頂點著色器使用一個position和跟它相關聯的color資料作為輸入資料,通過一個4×4矩陣變換位置,然後輸出變換後的位置和顏色資料。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1. // uniforms used by the vertex shader 2. uniform mat4 u_mvpMatrix; // matrix to convert P from model 3. // space to normalized device space. 4. 5. // attributes input to the vertex shader 6. attribute vec4 a_position; // position value
7. attribute vec4 a_color; // input vertex color 8. 9. // varying variables – input to the fragment shader 10. varying vec4 v_color; // output vertex color 11. 12. void 13. main() 14. { 15. v_color = a_color; 16. gl_Position = u_mvpMatrix * a_position; 17. }

第2行程式碼定義了一個uniform變數u_mvpMatrix,mat4表示4×4浮點數矩陣,該變數儲存了組合模型檢視和投影矩陣。6和7行程式碼定義了頂點著色器的輸入資料:Attributes,vec4表示包含了4個浮點數的向量,a_position是頂點位置屬性,a_color是頂點顏色屬性。第10行程式碼定義了varying型別的變數v_color,varying是用於從頂點著色器傳遞到片元著色器的變數,v_color是頂點著色器的輸出資料,儲存了每個頂點的顏色。12-17行的main函式是頂點著色器和片元著色器的入口,第15行讀取了頂點著色器輸入屬性中a_color的值,並把它賦值給輸出資料v_color,第16行的gl_Position 是內建的varying變數,不需要宣告,頂點著色器必須把變換後的位置賦值給它。

2.圖元裝配(Primitive Assembly)
頂點著色器之後,渲染流水線的下一個階段是圖元裝配,圖元是一個能用opengl es繪圖命令繪製的幾何體,繪圖命令指定了一組頂點屬性,描述了圖元的幾何形狀和圖元型別。頂點著色器使用這些頂點屬性計算頂點的位置、顏色以及紋理座標,這樣才能傳到片元著色器。在圖元裝配階段,這些著色器處理過的頂點被組裝到一個個獨立的幾何圖元中,例如三角形、線、點精靈。對於每個圖元,必須確定它是否位於視椎體內(3維空間顯示在螢幕上的可見區域),如果圖元部分在視椎體中,需要進行裁剪,如果圖元全部在視椎體外,則直接丟棄圖元。裁剪之後,頂點位置轉換成了螢幕座標。背面剔除操作也會執行,它根據圖元是正面還是背面,如果是背面則丟棄該圖元。經過裁剪和背面剔除操作後,就進入渲染流水線的下一個階段:光柵化。

3. 光柵化(Rasterization)
光柵化階段把圖元轉換成片元集合,之後會提交給片元著色器處理,這些片元集合表示可以被繪製到螢幕的畫素。如下圖所示:

4. 片元著色器(FragmentShader) 片元著色器對片元實現了一種通用的可程式設計方法,它對光柵化階段產生的每個片元進行操作,需要的輸入資料如下: Varying variables:頂點著色器輸出的varying變數經過光柵化插值計算後產生的作用於每個片元的值。 Uniforms:片元著色器使用的常量資料 Samplers:一種特殊的uniforms,表示片元著色器使用的紋理。 Shader program:片元著色器的原始碼或可執行檔案,描述了將對片元執行的操作。 片元著色器也可以丟棄片元或者為片元生成一個顏色值,儲存到內建變數gl_FragColor。光柵化階段產生的顏色、深度、模板和螢幕座標(Xw, Yw)成為流水線中pre-fragment階段(FragmentShader之後)的輸入。如下圖:

下面是一個簡單的片元著色器原始碼,可以跟上面的頂點著色器原始碼結合繪製一個高洛德著色的三角形。

1 2 3 4 5 6 7 8 9 10 1. precision mediump float; 2. 3. varying vec4 v_color; // input vertex color from vertex shader 4. 5. 6. void 7. main(void) 8. { 9. gl_FragColor = v_color; 10.}

第1行程式碼設定預設的精度修飾符,有highp、mediump、lowp,這個後面再詳細解釋。第3行程式碼定義了片元著色器的輸入資料,頂點著色器必須賦值給片元著色器一組一樣的varying變數。注意:gl_FragColor是片元著色器唯一的輸出,第9行程式碼把輸入資料v_color賦值給gl_FragColor。

5. 逐個片元操作階段(Per-Fragment Operations)
片元著色器之後就是逐個片元操作階段,包括一系列的測試階段。一個光柵化階段產生的具有螢幕座標(Xw, Yw)的片元,只能修改framebuffer(幀緩衝)中位置在(Xw, Yw)的畫素。下圖是Opengl es 2.0逐片元操作的過程:

Pixel ownership test:畫素所有權測試決定framebuffer中某一個(Xw, Yw)位置的畫素是否屬於當前Opengl ES的context,比如:如果一個Opengl ES幀緩衝視窗被其他視窗遮住了,視窗系統將決定被遮住的畫素不屬於當前Opengl ES的context,因此也就不會被顯示。
Scissor test:裁剪測試決定位置為(Xw, Yw)的片元是否位於裁剪矩形內,如果不在,則被丟棄。
Stencil and depth tests:模板和深度測試傳入片元的模板和深度值,決定是否丟棄片元。
Blending:將新產生的片元顏色值和framebuffer中某個(Xw, Yw)位置儲存的顏色值進行混合。
Dithering:抖動可以用來最大限度的減少使用有限精度儲存顏色值到framebuffer的工件。
逐片元操作之後,片元要麼被丟棄,要麼一個片元的顏色,深度或者模板值被寫入到framebuffer的(Xw, Yw)位置,不過是否真的會寫入還得依賴於write masks啟用與否。write masks能更好的控制顏色、深度和模板值寫入到合適的緩衝區。例如:顏色緩衝區中的write mask可以被設定成沒有紅色值寫入到顏色緩衝區。另外,Opengl ES 2.0提供從framebuffer中獲取畫素的介面,不過需要記住的是畫素只能從顏色緩衝區讀回,深度和模板值不能讀回。

注意:Opengl ES 2.0 的Per-Fragment Operations已經不再支援Alpha test 和 LogicOp了,這兩個步驟在 OpenGL 2.0 和 OpenGL ES 1.x中是存在的。Alpha test 階段不再需要的原因是片元著色器可以丟棄片元,所以可以在片元著色器中執行Alpha test。 LogicOp因為很少使用,所以不再支援了。


相關推薦

OpenGL ES 基礎概念介紹

Opengl es 2.0實現了可程式設計的圖形管線,比起1.x的固定管線要複雜和靈活很多,由兩部分規範組成:Opengl es 2.0 API規範和Opengl es著色語言規範。下圖是Opengl es 2.0渲染管線,陰影部分是opengl es 2.0的可程式設計階段。 1. 頂點著色器(

IPFS基礎概念介紹

每天 社區 lec IPFS 我們 研究 管理 技術分享 備份 (參考鏈塔智庫——星際?文件系統IPFS?生態研究報告-2018)鏈接:https://pan.baidu.com/s/14zeshAgrek8WnM7iAcSLAA 密碼:vki1 IPFS 入門筆記http

03: OpenGL ES 基礎教程02 使用OpenGL ES 基本步驟

war 點數據 緩存 ttr inf demo eve point 指南 第二章:讓硬件為你工作(OpenGL ES 應用實踐指南 iOS卷) 前言:   1:使用OpenGL ES 基本步驟   2:繪制三角形   3:效果    正文: 一:使用OpenGL ES

機器學習-1(基礎概念介紹

  首先我們要明白一點,什麼是機器學習? 我現在的理解就是資料,以及資料背後能夠被我們挖掘的含義。我們能利用這些資料去做些什麼    機器學習的主要任務就是分類 為了測試機器學習演算法的效果,通常使用兩套獨立的樣本集:訓練資料和測試資料 當機器學

Android OpenGL ES基礎

前言 此篇僅僅介紹一些概念,其他的內容,會在後面更新,後面內容會以仿抖音小視訊專案形式進行介紹。 什麼是OpenGL ES OpenGL :Open Graphics Library 圖形領域的工業標準,是一套跨程式語言、跨平臺的、專業的圖形程式設計(軟體)介面。它主

資料結構和演算法基礎概念介紹

一、什麼是演算法 演算法是指一系列解決問題的清晰指令。 二、演算法特徵 有窮性:演算法必須能夠在執行有限個步驟之後終止 確切性:演算法的每一步都必須要有確切的定義 輸入項:演算法必須有0個或多個輸入,描述演算法執行的初始狀態。0個輸入即演算法本身已經擁有了初始條

SpringCloud學習系列之一:基礎概念介紹

引言 本系列博文主要為SpringCloud學習的博文系列。 到底什麼是微服務 SpringCloud元件介紹 一、到底什麼是微服務 1、微服務的定義 "Microservice" 即微服務,在Martin Fowler的博文中介紹了微服務的具體概念。它是一

ZooKeeper基礎概念介紹 侵立刪

轉自:http://developer.51cto.com/art/201809/583184.htm   我本人曾經使用過 ZooKeeper 作為 Dubbo 的註冊中心,另外在搭建 Solr 叢集的時候,我使用到了 ZooKeeper 作為 Solr 叢集的管理工具。 前

OpenGL ES基礎教程

一、設定OpenGL ES檢視 設定OpenGL檢視並不難,Android上也較簡單。我們一般只需要2個步驟。 GLSurfaceView 我們要為GLSurfaceView提供一個專門用於渲染的介面 public void  setRenderer(GLSurface

OpenGL開發基礎知識介紹

最近由於手機專案中需要用到OpenGL ES的知識,所以這段時間正在研究OpenGL的相關知識。因為OpenGL ES是OpenGL的剪裁版本,所以我直接從OpenGL入手,然後再去看OpenGL ES就很容易上手。從此篇開始,我將發表一系列文章來逐步深入介紹OpenGL的

opengl es 基礎知識瞭解

前面介紹了使用Android 編寫OpenGL ES應用的程式框架,本篇介紹3D繪圖的一些基本構成要素,最終將實現一個多邊形的繪製。 一個3D圖形通常是由一些小的基本元素(頂點,邊,面,多邊形)構成,每個基本元素都可以單獨來操作。 Vertex (頂點) 頂點是3D建模時用到的最小構成元素,頂點定義為兩條或

8天入門wpf—— 第一天 基礎概念介紹

             這些天從專案上接觸到了wpf,感覺有必要做一個筆記,首篇還是聊聊基本的概念,要學習wpf,我們需要採用webform的思維來考慮問題。 一:App環境承載      我們都知道,console和winform程式的入口函式都是main,wpf同樣也

OpenGL ES 基礎知識筆記

1. SurfaceView在遊戲中的使用:     SurfaceView繼承自View,但它與View不同,View是在UI的主執行緒中更新畫面,而     SurfaceView是在一個新執行緒中更新畫面。View的特性決定了其不適合做動畫,因為     如果更新畫

通俗地說決策樹演算法(一)基礎概念介紹

決策樹算是比較常見的資料探勘演算法了,最近也想寫點演算法的東西,就先寫個決策樹吧。 一. 什麼是決策樹 決策樹是什麼,我們來“決策樹”這個詞進行分詞,那麼就會是決策/樹。大家不妨思考一下,重點是決策還是樹呢?其實啊,決策樹的關鍵點在樹上。 我們平時寫程式碼的那一串一串的If Else其實就是決策樹的思想了。看

RabbitMQ基礎概念詳細介紹

可用性 將不 tar connect 相互 abi 封裝 編寫 綁定 原文地址:http://www.diggerplus.org/archives/3110 引言 你是否遇到過兩個(多個)系統間需要通過定時任務來同步某些數據?你是否在為異構系統的不同進程間相互調用、通

OpenGL ES EGL介紹

前面已經在android平臺上使用OpenGL ES的API瞭解瞭如何建立3D圖形已經使用FBO渲染到紋理進行一些其他的操作,起初我學習OpenGL ES的目的就是為了研究Android平臺上錄製螢幕的方案。到目前為止,基礎知識已經具備了,還差一點需要了解的是Embedded Graphic

小白學ES 01-Elasticsearch的基礎概念

目錄 1 Elasticsearch概述 1.1 Elasticsearch是什麼 1.2 Elasticsearch的優點 1.3 Elasticsearch的相關產品 1.4 Elasticsearch的使用場景 2 Elasticsearch的功

android平臺下OpenGL ES 3.0著色語言基礎知識(下)

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

Android OpenGL ES 簡明開發教程三 3D繪圖基本概念

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

IPC基礎概念介紹

本篇主要是介紹 IPC 中的一些基礎概念,主要包括以下三個方面的內容: Java 中 Serializable 介面 Android 中 Parcelable 介面 Binder  熟悉完這三個方面內容後,才可以更好的理解跨程序通訊的各種方式。Ser