GLSL,OpenGL Shading Language,GLSL中沒有指針,並且沒有任何類型的字符串或字符。
(1)GLSL的修飾符與基本數據類型
const:用於聲明非可寫的編譯時常量變量;
attribute:用於經常更改的信息,只能在頂點着色器中使用;
uniform:用於外部程序傳遞給shader的變量,shader只能用,不能改;
varying:用於從頂點着色器向片元着色器傳遞數據的變量。
然后是基本數據類型,int、float、bool。注意float可以指定精度:
highp:32bit,一般用於頂點坐標(vertex coordinate);
medium:16bit,一般用於紋理坐標(texture coordinate);
lowp:8bit,一般用於顏色表示。
接下來是向量類型。
vec4:4分量浮點向量;
ivec4:4分量整數向量;
uvec4:4分量無符號整數向量;
bvec4:4分量布爾向量;
四維向量:
attribute vec4 position;
矩陣類型,所有的矩陣類型都只支持浮點數,不支持整數或者布爾矩陣:
uniform lowp mat4 colorMatrix;
紋理類型,一般僅在Fragment Shader中使用這個類型,二維紋理的聲明方式如下:
uniform sampler2D texSampler;
最后是varing,用於在Vertex Shader和Fragment Shader中傳遞參數。首先在VS中聲明這個類型的變量代表紋理的坐標點,並且對這個變量進行賦值,代碼如下:
attribute vec2 texcoord; varying vec2 v_texcoord; void main(void) { v_texcoord = texcoord; }
緊接着在FS中也聲明同名的變量,然后使用texture2D方法取出二維紋理中該紋理坐標點上的像素值,代碼如下:
varying vec2 v_texcoord;
vec4 texel = texture2D(texSampler, v_texcoord);
取出了該坐標點上的像素值之后,就可以進行像素變化操作了,比如說提高對比度,最終將改變的像素值賦給gl_FragColor。
(2)GLSL的內置函數與內置變量
最常見的內置變量是兩個Shader的輸出變量,首先是VS的:
vec4 gl_position;
上述代碼用來設置頂點轉換到屏幕坐標的位置,VS一定要去更新這個數值。
float gl_pointSize;
在粒子效果的場景下,需要為粒子設置大小,改變該內置變量的值就是為了設置每一個粒子矩形的大小。
其次是FS的內置變量:
vec4 gl_FragColor;
上述代碼用於指定當前紋理坐標所代表的像素點的最終顏色值。
(3)其他
sampler2D類型,其實就是紋理數據。另外還有一個方法texture2D,第一個參數是紋理數據,第二個參數是紋理坐標,這個方法就是在紋理數據中取出當前片段對應在紋理數據中位置上的數據顏色。