著色器語言
(一)名詞解釋:
1.圖元:
圖形軟件用來描述各種圖形的函數
簡單版:圖元就是組成圖像的基本單元
2.OpenGL渲染管線(重點)
渲染流水線:是顯卡芯片內部處理圖形信號相互獨立的并行處理單元芙扎。
簡單版:也就是把數據轉化到openGL并且生成最終圖像的一個過程唆阿!
3,GLSL是什么:
GLSL是一門專門為圖形開發(fā)設計的編程語言
,4盐类,可編程管線的編程階段(重點)(流水線都干了啥呢挤茄?烘挫?)
5.分析簡單的頂點著色器
案例:
version 330 core //版本號
in vec4 vPosition;//in數據入口 恳邀,vec4 (x,y颂砸,z噪奄,w)向量(w叫做齊次坐標) vPosition變量名//頂點
//矩陣 來做矩陣變換
unifrom mat4 modelViewProjectionMAtrix ;
void main(){
//內置變量
glPosition = modelViewProjectionMAtrix * vPosition;
}
基本語法
注釋:// /.../
main沒有返回值
每一行的結尾都要有分號
(二)GLSL變量認識:(不要思考C/C++和java)
1.GLSL支持的基本數據類型:
類型 描述
float IEEE 32浮點值
int 32位整數
bool 布爾值
uint double
2.什么是標量:只有大小沒有方向
3.變量命名規(guī)范:
1.數字和“_”不能作為開頭
2.變量名不能包含連續(xù)的下劃線
3.用戶變量不能用“gl”開頭
4.見名識意
4.變量的初始化:
float f=1.0;
bool b=true人乓;
int i=15勤篮;
5.類型轉換(win):
float f=1.0;
bool b=bool(f)
(三)聚合類型——向量
1.什么是向量 :有方向的量
2.向量在著色器中的作用
位置色罚,顏色碰缔,紋理
3.基本類型
基本類型(標量) 2d向量 3D向量 4D向量
float vec2 vec3 vec4
int ivec2 ivec3 ivec4
bool bvec2 bvec3 bvec4
1.向量初始化
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);
(四)聚合類型——矩陣
1.矩陣在3D開發(fā)中的作用
位移什黑,旋轉,縮放
2.矩陣類型
double dmat2 dmat3 dmat4
float mat2 mat3 mat4
22的浮點數矩陣 33的浮點數矩陣 4*4的浮點數矩陣
1.0,1.0
1.0,1.0 1.0,1.0,1.0
1.0,1.0,1.0
1.0,1.0,1.0 1.0,1.0,1.0,1.0
1.0,1.0,1.0,1.0
1.0,1.0,1.0,1.0
1.0,1.0,1.0,1.0
3.矩陣初始化
4.0 0 0
0 4.0 0
0 0 4.0
構建方式:
只傳一個值
m=mat3(4.0);
以下三種寫法得到效果是一樣的:
mat3 m=( 1.0,2.0,3.0,
4.0,5.0,6.0,
7.0,8.0,9.0);
1.0 4.0 7.0
2.0 5.0 8.0
3.0 6.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首先填充列 然后填充行:
(五)向量和矩陣內的元素訪問
1,什么是分量
聚合類型 的元素
例如 vec3 xyz=vec3(1.0,1.0,1.0)堪夭;
xyz.x
2,分量名稱三種形式的集合
分量訪問符
(x,y,z,w) 位置坐標
(r,g,b,a) 顏色
(s,t,p,q) 紋理坐標
3,向量與矩陣中的元素訪問方式愕把?
1向量:使用分量的名稱
2矩陣:可以以二維數組的方式進行訪問(索引)
4,向量內元素訪問(詳解)
例如:vec3 rgb=vec3(1.0,1.0森爽,1.0);
float r=rgb.r;
float g=rgb.g;
數組方式獲取
float r1=rgb[0];
5,矩陣內元素的訪問
2.0 0 0 0
0 2.0 0 0
0 0 2.0 0
0 0 0 2.0
例如:mat4 m=mat4(2.0);
我要獲取矩陣的第二列
vec4 xyzw = m[1];
獲取具體的標量
float f=m[2][2];
//也可以這樣寫 m[2].z;
齊次坐標:就是將n維的向量用一個n+1維來表示恨豁!
定義:所謂齊次坐標就是將一個原本是n維的<u>向量</u>用一個n+1維向量來表示。
例如爬迟,二維點(x,y)的齊次坐標表示為(hx,hy,h)橘蜜。由此可以看出,一個向量的齊次表示是不唯一的付呕,齊次坐標的h取不同的值都表示的是同一個點计福,比如齊次坐標(6,4,2)、(3,2,1)表示的都是二維點(3,2)徽职。
給出點的齊次表達式[X Y H]象颖,就可求得其二維笛卡爾坐標,
即:[X Y H]→= [x y 1]姆钉, 這個過程稱為正乘刀化處理。
在幾何意義上育韩,相當于把發(fā)生在三維空間的變換限制在H=1的平面內克蚂。
那么引進齊次坐標有什么必要,它有什么優(yōu)點呢筋讨?
許多圖形應用涉及到幾何變換埃叭,主要包括平移、旋轉悉罕、縮放赤屋。以矩陣表達式來計算這些變換時立镶,平移是矩陣相加,旋轉和縮放則是矩陣相乘类早,綜合起來可以表示為p' = p m1+ m2(m1旋轉縮放矩陣媚媒, m2為平移矩陣, p為原向量 涩僻,p'為變換后的向量)缭召。引入齊次坐標的目的主要是合并矩陣運算中的乘法和加法,表示為p' = pM的形式逆日。即它提供了用矩陣運算把二維嵌巷、三維甚至高維空間中的一個點集從一個坐標系變換到另一個坐標系的有效方法。
其次室抽,它可以表示無窮遠的點搪哪。n+1維的齊次坐標中如果h=0,實際上就表示了n維空間的一個無窮遠點坪圾。對于齊次坐標(a,b,h)晓折,保持a,b不變,|V|=(x1x1兽泄,y1y1,z1*z1)^1/2的過程就表示了標準坐標系中的一個點沿直線ax+by=0 逐漸走向無窮遠處的過程漓概。
(六)結構體和采樣器
1.什么是采樣器
專門來進行紋理采樣的;
一般情況下 一個采樣器代表了一套或者一副紋理
采樣器類型 說明
sampler2D 用來訪問2維紋理的
sampler3D 用來訪問3維紋理的
samplerCube 立體貼圖的紋理
注意:1.采樣器的變量不能在 著色器中初始化
2.一般情況下 采樣器的變量都是用 uniform 限定符來修飾的已日,從宿主語言(java)接收傳遞遞進來的著色器的值垛耳;
3.sampler3D并不是在所有的OpenGLES實現中都是支持的,(如果非要用飘千,在著色器代碼中代開相應的拓展)
1,什么是結構體
簡單版:就是從邏輯上將 不同類型的數據組合到一個數據集合中堂鲜。
2,結構體的作用
簡化運算
3,怎么定義一個結構體
struct info{
vec3 color;//顏色
vec3 xyz; //位置
vec2 st; //紋理
}
4,怎么調用結構體元素做為輸入參數
info ttt=info ( vec3(,护奈,)缔莲,vec3(,霉旗,)痴奏,vec2(,))厌秒;
vec3 color=ttt.color;
(七)數組
1,什么是數組
有限個類型相同的變量集合读拆;
2,GLSL數組特性以及注意事項
1.GLSL支持任意類型的數組,包括結構體數組
2.索引從零開始
3.沒有負數索引鸵闪,索引也不能超出范圍
4.數組可以定義為有大小檐晕,或者沒有大小
float c[3];//有三個float元素
float [3]c;
float c[ ];//未定義位數,稍后可以聲明
5.數組數GLSL第一等類型
1辟灰,GLSL里面數組有構造函數个榕,并且用函數的參數做返回類型。
2芥喇,可以靜態(tài)初始化一個數組
float c[3]=float[3](1.0,1.0,1.0);
6.GLSL有個隱式的方法 可以返回元素個數(length)
float c[3]=float[3](1.0,1.0,1.0);
int t=c.length西采;
7.多維數組
float c[3][5];