android開發之OpenGL(二)

GLSL語言

(一)名詞解釋:

1、圖元:圖形軟件用來描述各種圖形的函數。
2、OpenGL渲染管線
渲染流水線:是顯卡芯片內部處理圖形信號相互獨立的並行處理單元。簡單理解就是把數據轉化到OpenGL並且生成最終圖像的一個過程!
3、GLSL是什麼?
GLSL是一門專門爲圖形開發設計的編程語言。
4、可編程管線的編程階段
這裏寫圖片描述
頂點處理階段:由頂點着色器、細分着色器和幾何着色器組成。主要功能是決定了圖元的位置。
頂點着色器:當緩存數據初始化完成之後,頂點着色開始接受頂點數據,並單獨處理每個頂點,頂點處理完之後,開始激活細分着色器。
細分着色器:分爲細分控制着色器和細分計算着色器。用來描述物體的形狀,在管線中生成新的幾何體,並把這個幾何體處理的更加平順,然後就會成爲最終狀態。
幾何着色器:細分着色器將最終的模型傳給了幾何着色器,其實在管線內部會對這些圖元都進行修改,因爲有的合適有的不合適,所以到了幾何着色器就開始對所有的圖像進行修改,改變幾何圖元的類型或者放棄掉沒有用的圖元。
片元處理階段:由片元裁剪、光柵化和片元着色器組成。主要決定了片元的存在以及片元的顏色。
圖元裁剪:剪切掉光柵化之前我們看不到(視口以外)的圖元。
光柵化:將輸入圖元的數學描述轉換爲與屏幕位置對應的像素片元的過程。
片元着色器:主要處理光柵化之後的單獨片元,主要計算了片元的顏色和深度值,然後開始傳遞到片元測試和混合模塊。這裏像光照,霧化處理都在這一步。

(二)GLSL變量

(1)GLSL支持的基本數據類型:
float、int、bool、uint/double。
(2)標量:只有大小沒有方向
(3)變量命名規範:
1. 數字和“_”不能作爲開頭
2. 變量名不能包含連續的下劃線
3. 用戶變量不能用“gl”開頭
4. 見名識意
(4)變量的初始化:
float f=1.0;
bool b=true;
int i=15;
(5)類型轉換(win):
float f=1.0;
bool b=bool(f)
(6)聚合類型——向量
向量 :有方向的量
向量在着色器中的作用:位置,顏色,紋理
基本類型
這裏寫圖片描述
向量初始化:
1、聲明變量的初始化
vec3 xyz=vec3(1.0,1.0,1.0);
float x= xyz.x;
vec3 rgb=vec3(1.0,1.0,1.0);
float r=rgb.r;
float g=rgb.g;
當三個值相等的時候
vec3 rgb=vec3(1.0 );等價於vec3 rgb=vec3(1.0,1.0,1.0);
2、類型之間等價交換
vec3 xyz1=vec3(1.0,1.0,1.0);
vec3 xyz2=vec3(xyz1);
3、截短
vec3 xyz1=vec3(1.0,1.0,1.0);
vec2 xy=vec2(xyz1);
4、加長
vec2 xy=vec2(xyz1);
vec3 xyz1=vec3(xy ,1.0);
(7)矩陣
矩陣在3D開發中的作用:位移,旋轉,縮放
.矩陣類型
這裏寫圖片描述
矩陣初始化
只傳一個值:m=mat3(4.0);
這裏寫圖片描述
以下三種寫法得到效果是一樣的:
mat3 m=( 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0);
////
vec3 f1=vec3(1.0,2.0,3.0);
vec3 f2=vec3(4.0,5.0,6.0);
vec3 f3=vec3(7.0,8.0,9.0);
mat3 m=mat3( f1,f2,f3 );
////
vec2 f1=vec2(1.0,2.0);
vec2 f2=vec2(4.0,5.0);
vec2 f3=vec2(7.0,8.0);
mat3 m=mat3(f1,3.0,f2,6.0,f3 ,9.0
GLSL首先填充列 然後填充行:
這裏寫圖片描述

(8)向量和矩陣內的元素訪問
1、什麼是分量?
聚合類型的元素
例如:vec3 xyz = vec3(1.0,1.0,1.0);
xyz.x:分量,也是聚合類型的元素
2、分量名稱三種形式的集合
這裏寫圖片描述
3、向量與矩陣中的元素訪問方式?
向量:使用分量的名稱
矩陣:可以以二維數組的方式進行訪問
4、向量內元素訪問(詳解)
例如:vect3 rgb = vec3(1.0,1.0,1.0);
float r = rgb.r;
float g = rgb.g;
數組方式獲取:
float r1 = rgb[0];
5、矩陣內元素的訪問(詳解)
例如:mat4 m = mat4(2.0);
這裏寫圖片描述
獲取矩陣的第二列:vect4 xyzw = m[2];
獲取具體的標量:float f = m[2][2];//也可以這樣寫:m[2].z;
6、齊次座標:就是將n維的向量用一個n+1維來表示。
(4,2,1)和(8,4,2)都表示的二維點(4,2)。
(9)結構體和採樣器
什麼是採樣器?
專門來進行紋理採樣的。
一般情況下一個採樣器代表了一套或者一副紋理。
這裏寫圖片描述
注意:1、採樣器的變量不能在着色器中初始化。
一般情況下采樣器的變量都是用uniform這個限定符來修飾的,從宿主語言(java)接收傳遞進來的着色器的值。
3、sampler3D並不是在所有的OpenGLES實現中都是支持的,如果非要用,在着色器代碼中打開相應的拓展。
1、結構體:
就是從邏輯上將不同類型的數據組合到一個數據集合中。
結構體的作用
簡化運算。
定義一個結構體
struct info{
vec3 color;//顏色
vec3 xyz; //位置
vec3 st; //紋理
}

4、怎麼調用結構體元素作爲輸入參數
info cxs = info(vec3(1.0,2.0,3.0),vec3(4.0,5.0,6.0),vec3(7.0,8.0,9.0));
vec3 color = info.color;
(10)數組
1、數組:有閒個類型相同的變量集合;
2、GLSL數組特性以及注意事項
GLSL支持任意類型的數組,包括結構體數組。
索引從零開始
沒有負數索引
數組可以定義爲有大小或者沒有大小
數組數GLSL第一等類型
GLSL裏面數組有構造函數,並且用函數的參數作爲返回類型。
可以靜態初始化一個數組
float c[3] = float3;
GLSL有一個隱式的方法,可以返回元素個數(length)。
int t = c.length;
多維數組:float c[3][5];
(11)類型修飾符
1、類型修飾符作用
這裏寫圖片描述
這裏寫圖片描述

(12)語句
1.GLSL操作符與優先級
這裏寫圖片描述
(12)操作符重載
GLSL裏大部分操作符都是經過重載的,也就是說他們可以用作多種數據類型操作
1.向量和矩陣相乘
例如:vec3 xyz;
mat3 m;
vec3 xyz1 = xyz*m;
注意:要求向量的維度和矩陣的維度必須匹配!
2向量相乘:逐個分量相乘
vec2 a,b,c;
c=a*b;//計算 c=( a.x*b.x , a.y*b.y );
3矩陣相乘: 得到是通常矩陣相乘的結果;
例如:mat2 m,u,v;
m=u*v;
//m=(u00*v00+u01*v10 u00*v01+u01*v11
u01*v00+u11*v10 u10*v01+u11*v11);
4、控制流
if(){}else{}
switch(){}
5、循環語句
for(){}
while(){}
do{}while()
6、流控制語句
這裏寫圖片描述
函數聲明
注意:
1.函數聲明,變量名需要添加訪問修飾符
2.GLSL支持用戶自定義函數,同時它定義了一些內置函數
3.函數名稱可以是任何字符、數字、下劃線,但是不能使用數字,連續下劃線或者gl_作爲函數的開始
4.返回值可以是任何內置的GLSL類型,或者用戶定義的結構體和數組類型。
5.返回值是數組時,必須現實的指定大小。函數返回類型是void則沒有返回值
6.函數的參數也可以是任何類型的函數,包括數組(這裏數組必須設置大小)
7.在使用一個函數前必須聲明他的原型或者直接給出函數體。
8.GLSL的編譯器在使用函數前必須找到函數的聲明,否則會產生錯誤
9.函數原型只是給出了函數的形式,但是並沒有給出具體的實現內容
例如:
float HornerEvalPolynomial(float coeeff[10] ,float x);
(13)程序的基本結構
1.程序基本組成
2. 案例分析
案例:

uinfrom mat4 uMVPMatrix;

attruibte vec3 aPosition;

varying vec2 vTextureCoord;


void positionShift(){




gl_Position = uMVPMatrix * vec4(aPosition,1.0);



}





   void main(){




    positionShift();





        vTextureCoord = aTexCoor;





  }

(14)內建變量
這裏寫圖片描述
(15)頂點着色器

這裏寫圖片描述

這裏寫圖片描述

(16)片元着色器
片元着色器中的內建變量分爲輸入變量以及輸出變量。
一、輸入變量
片元着色器中的內建輸入變量主要有 gl_FragCoord 和 gl_FrontFacing。這兩個內建變量都是隻讀的,由渲染管線中片元着色器之前階段生成。
這裏寫圖片描述
二、輸出變量
片元着色器中的內建輸出變量主要有gl_fragColor與gl_FragData
這裏寫圖片描述
三、內置變量表格
1.定點着色器的內置變量
這裏寫圖片描述
2.片元着色器的內置變量
這裏寫圖片描述
(17)內建函數

與其他高級語言類似,爲了方便開發,OpenGL ES着色語言也提供了很多的內置函數。
這些函數大都已經被重載,一般具有4種變體,分別用來接收和返回float、vec2、vec3以及vec4類型的值。
爲什麼使用內置函數:
1.內置函數都是以最優的方式實現的,有部分函數甚至由硬件直接支持,大大提高了執行效率!
注意:大部分內置函數同時適用於頂點作色器與片元着色器,但也有部分內置函數只適合頂點着色器或者片元着色器的
內置函數按照設計目的分爲3個類型:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章