数据类型及其使用
基本数据类型
float,bool,int,uint
与C语言类似,定义一个变量的同时可以进行初始化
GLSL是强类型语言:必须进行显式的强势类型转换,不存在隐式的类型转换。
int b=2.0;//错误,无自动类型转换
int b=int(2.0); //正确
向量类型(vec)
vec{2,3,4}:a vector of 2,3,or 4floats
bvec{2,3,4}:bool vector
ivec{2,3,4}:vector of integers
用例:
vec2 a=vec2(1.0,2.0);
vec2 b=vec2(3.0,4.0);
vec4 c=vec4(a,b);
vec4 color;
vec3 RGB=vec3(color);
vec4 a=vec4(1.0,2.0,3.0,4.0);
float posY=a[1]; //下标方式
float posX=a.x;//名称方式(选择子方式)
选择因子(selector)
- x,y,z,w
- r,g,b,a
- s,t,p,q
向量乘法:
vec3 a=vec3(1.0,2.0,3.0);
vec3 b=3.0*a;
向量的点积和叉积:用内建函数dot和cross
float NdotL=dot(normal,lightDir);
vec3 dir=cross(normal,lightDir);
矩阵类型(mat)
矩阵只有浮点型的。
矩阵是列优先顺序
mat2:2*2矩阵 mat3:3*3矩阵
mat4: 4*4矩阵 mat2x3,mat2x4
mat3x2, mat3x4 mat4x2, mat4x3
mat4 m=mat4(1.0);//初始化了一个对角线矩阵
vec2 a=vec2(1.0,2.0);
vec2 b = vec2(3.0, 4.0); mat2 n = mat2(a, b); // 列优先排列
mat2 k = mat2(1.0, 2.0, 3.0, 4.0); // 列优先排列
数组
在GLSL中,可以像C一样声明和访问数组
只支持一维数组
下标不能为负
float a[10];
float coeff[3]=float[3](1.0,2.1,3.5);
GLSL数组提供了一个隐式的方式length()
for(int i=0;i<coeff.length();i++)
{
coeff[i]*=2.0;
}
struct dirlight
{
vec3 direction;
vec3 color;
}light;
struct dirlight
{
vec3 direction;
vec3 color;
};
dirlight light=dirlight(vec3(1.0,1.0,0.0),vec3(0.8,0.8,0.4));
Sampler类型
sampler1D – for 1D textures
sampler2D – for 2D textures
sampler3D – for 3D textures
samplerCube – for cube map textures
sampler1DShadow – for shadow maps
sampler2DShadow – for shadow maps
uniform sampler2D brickTex;
vec4 texel=texture2D(brickTex,gl_TexCoord[0].st);
变量前的限定符
const:声明一个只读变量。
uniform:不随图元变化的全局变量;RO
in:VS中为输入的顶点属性;FS中为片段属性;RO
out:VS中输出的顶点属性;RW
centorid,smooth,flat,nonperspective:限定插值方式
内建函数
Trigonometry/angle | radians,degrees,sin,cos,tan,asin,acos,atan |
Exponential | pow,exp2,log2,sqrt,inversesqrt |
Geometric and matrix | length,distance,dot,across,normalize,ftransform,faceforward,reflect,matrixCompMult |
Misc | abs,sgn,floor,ceil,fract,mod,min,max,clamp,mix,step,smoothstep |