OpenGL ES 基礎概念介紹
Opengl es 2.0實現了可程式設計的圖形管線,比起1.x的固定管線要複雜和靈活很多,由兩部分規範組成:Opengl es 2.0 API規範和Opengl es著色語言規範。下圖是Opengl es 2.0渲染管線,陰影部分是opengl es 2.0的可程式設計階段。
![20140419234308](http://codingnow.cn/wp-content/uploads/2014/04/20140419234308.png)
下面是一個用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)
光柵化階段把圖元轉換成片元集合,之後會提交給片元著色器處理,這些片元集合表示可以被繪製到螢幕的畫素。如下圖所示:
![20140420145854](http://codingnow.cn/wp-content/uploads/2014/04/20140420145854.png)
下面是一個簡單的片元著色器原始碼,可以跟上面的頂點著色器原始碼結合繪製一個高洛德著色的三角形。
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