GLSL語言
(一)名詞解釋:
1璧亚、圖元:圖形軟件用來描述各種圖形的函數(shù)。
2帆吻、OpenGL渲染管線
渲染流水線:是顯卡芯片內(nèi)部處理圖形信號相互獨立的并行處理單元展运。簡單理解就是把數(shù)據(jù)轉(zhuǎn)化到OpenGL并且生成最終圖像的一個過程!
3铅忿、GLSL是什么剪决?
GLSL是一門專門為圖形開發(fā)設(shè)計的編程語言。
4檀训、可編程管線的編程階段
頂點處理階段:由頂點著色器柑潦、細(xì)分著色器和幾何著色器組成。主要功能是決定了圖元的位置峻凫。
頂點著色器:當(dāng)緩存數(shù)據(jù)初始化完成之后渗鬼,頂點著色開始接受頂點數(shù)據(jù),并單獨處理每個頂點荧琼,頂點處理完之后譬胎,開始激活細(xì)分著色器。
細(xì)分著色器:分為細(xì)分控制著色器和細(xì)分計算著色器命锄。用來描述物體的形狀堰乔,在管線中生成新的幾何體,并把這個幾何體處理的更加平順脐恩,然后就會成為最終狀態(tài)镐侯。
幾何著色器:細(xì)分著色器將最終的模型傳給了幾何著色器,其實在管線內(nèi)部會對這些圖元都進(jìn)行修改驶冒,因為有的合適有的不合適苟翻,所以到了幾何著色器就開始對所有的圖像進(jìn)行修改搭伤,改變幾何圖元的類型或者放棄掉沒有用的圖元。
片元處理階段:由片元裁剪袜瞬、光柵化和片元著色器組成怜俐。主要決定了片元的存在以及片元的顏色。
圖元裁剪:剪切掉光柵化之前我們看不到(視口以外)的圖元邓尤。
光柵化:將輸入圖元的數(shù)學(xué)描述轉(zhuǎn)換為與屏幕位置對應(yīng)的像素片元的過程拍鲤。
片元著色器:主要處理光柵化之后的單獨片元,主要計算了片元的顏色和深度值汞扎,然后開始傳遞到片元測試和混合模塊季稳。這里像光照,霧化處理都在這一步澈魄。
(二)GLSL變量
(1)GLSL支持的基本數(shù)據(jù)類型:
float景鼠、int、bool痹扇、uint/double铛漓。
(2)標(biāo)量:只有大小沒有方向
(3)變量命名規(guī)范:
- 數(shù)字和“_”不能作為開頭
- 變量名不能包含連續(xù)的下劃線
- 用戶變量不能用“gl”開頭
見名識意
(4)變量的初始化:
float f=1.0;
bool b=true鲫构;
int I=15浓恶;
(5)類型轉(zhuǎn)換(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;
當(dāng)三個值相等的時候
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開發(fā)中的作用:位移蚊伞,旋轉(zhuǎn)席赂,縮放
.矩陣類型
矩陣初始化
只傳一個值: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)向量和矩陣內(nèi)的元素訪問
1吮铭、什么是分量?
聚合類型的元素
例如:vec3 xyz = vec3(1.0,1.0,1.0);
xyz.x:分量颅停,也是聚合類型的元素
2谓晌、分量名稱三種形式的集合
3、向量與矩陣中的元素訪問方式癞揉?
向量:使用分量的名稱
矩陣:可以以二維數(shù)組的方式進(jìn)行訪問
4纸肉、向量內(nèi)元素訪問(詳解)
例如:vect3 rgb = vec3(1.0,1.0,1.0);
float r = rgb.r;
float g = rgb.g;
數(shù)組方式獲取:
float r1 = rgb[0];
5喊熟、矩陣內(nèi)元素的訪問(詳解)
例如:mat4 m = mat4(2.0);
獲取矩陣的第二列:vect4 xyzw = m[2];
獲取具體的標(biāo)量:float f = m[2][2];//也可以這樣寫:m[2].z;
6柏肪、齊次坐標(biāo):就是將n維的向量用一個n+1維來表示。
(4,2,1)和(8,4,2)都表示的二維點(4,2)芥牌。
(9)結(jié)構(gòu)體和采樣器
什么是采樣器烦味?
專門來進(jìn)行紋理采樣的。
一般情況下一個采樣器代表了一套或者一副紋理壁拉。
注意:1谬俄、采樣器的變量不能在著色器中初始化。
一般情況下采樣器的變量都是用uniform這個限定符來修飾的弃理,從宿主語言(java)接收傳遞進(jìn)來的著色器的值凤瘦。
3、sampler3D并不是在所有的OpenGLES實現(xiàn)中都是支持的案铺,如果非要用蔬芥,在著色器代碼中打開相應(yīng)的拓展。
1控汉、結(jié)構(gòu)體:
就是從邏輯上將不同類型的數(shù)據(jù)組合到一個數(shù)據(jù)集合中笔诵。
結(jié)構(gòu)體的作用
簡化運算。
定義一個結(jié)構(gòu)體
struct info{ vec3 color;//顏色 vec3 xyz; //位置 vec3 st; //紋理 }
4姑子、怎么調(diào)用結(jié)構(gòu)體元素作為輸入?yún)?shù)
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)數(shù)組
1乎婿、數(shù)組:有限個類型相同的變量集合;
2街佑、GLSL數(shù)組特性以及注意事項
GLSL支持任意類型的數(shù)組谢翎,包括結(jié)構(gòu)體數(shù)組。
索引從零開始
沒有負(fù)數(shù)索引
數(shù)組可以定義為有大小或者沒有大小
數(shù)組數(shù)GLSL第一等類型
GLSL里面數(shù)組有構(gòu)造函數(shù)沐旨,并且用函數(shù)的參數(shù)作為返回類型森逮。
可以靜態(tài)初始化一個數(shù)組
float c[3] = float3;
GLSL有一個隱式的方法,可以返回元素個數(shù)(length)磁携。
int t = c.length;
多維數(shù)組:float c[3][5];
(11)類型修飾符
1褒侧、類型修飾符作用