Learning OpenGL:GLSL Shader 手册

基本类型

类型 说明
void 空类型
bool 布尔类型
int 带符号的整数 signed integer
float 带符号的浮点数 floating scalar
vec2,vec3,vec4 n维浮点数向量 n-component floating point vector
bvec2,bvec3,bvec4 n维整数向量 singed integer vector
bvec2,bvec3,bvec4 n维布尔向量 boolean vector
ivec2,ivec3,ivec4 n维整数向量 singed integer vector
mat2,mat3,mat4 2X2,3X3,4X4 浮点数矩阵 float matrix
sampler2D 2D 纹理 a 2D texture
samplerCube 盒纹理 cube mapped texture

基本结构和数组

类型 说明
结构 struct type-name{} 类似c语言中的结构体
数组 float foo3[] glsl 只支持1维数组,数组可以是结构体的成员

##内置的特殊变量

glsl程序使用一些特殊的内置变量与硬件进行沟通。大致分成input,output两种类型,input类型,负责向硬件(渲染管线)发送数据,output类型负责向程序回传数据。

  • 在vertex shader中

output 类型的内置变量:

变量 说明 单位
highp vec4 gl_Position; gl_Position 放置顶点坐标信息 vec4
mediump float gl_Pointsize; gl_PointSize 需要绘制点的大小(只在gl.POINTS模式下有效) float
  • 在fragment Shader中:

input 类型的内置变量:

变量 说明 单位
mediump vec4 gl_FragCoord; 片元在fragmebuffer画面的相对位置 vec4
bool gl_FrontFacing 标志当前图元是不是正面图元的一部分 bool
mediump vec2 gl_PointCoord; 经过插值计算后的纹理坐标,点的范围是0.0到1.0 vec2

output 类型的内置变量:

变量 说明 单位
mediump vec4 gl_FragColor; 设置当前片点的颜色 vec4
mediump vec4 gl_FragData[n]; 设置当前片点的颜色,使用glDrawBuffers数据数组 vec4

##内置函数库

###通用函数

方法 说明
T abs(T x) 返回x的绝对值
T sign(T x) 比较x与0的值,大于,等于,小于 分别返回 1.0, 0.0, -1.0
T floor(T x) 返回 <= x 的最大整数
T ceil(T x) 返回 >= x 的最小整数
T fract(T x) 返回 x 的小数部分
T mod(T x,T y) T mod(T x,float y) 取 x,y 的余数
T min(T x,T y) T min(T x,float y) 取 x,y 的最小值
T max(T x,T y) T max(T x,float y) 取 x,y 的最大值
T clamp(T x,T minVal, T maxVal) T clamp(T x,float minal, float maxVal) min ( max (x, minVal), maxVal),返回值限定在minVal,maxVal之间
T mix(T x,T y, T a) T mix(T x,T y, float a) 取 x,y 的线性混合,x(1-a)+ya
T step(T edge,T x) T step(float edge,T x) if x < edge返回0.0, 否则返回1.0
T smoothstep(T edge,T edge1, T x) T smoothstep(float edge0, float edge1,T x) if x < edge0返回 0.0,if x > edge1返回1.0, 否则返回Hermite插值

角度&三角函数

下文中的类型T可以是float, vec2, vec3, vec4且可以逐分量操作.

方法 说明
T radinans(T degrees) 角度转弧度
T degrees(T radians) 弧度转角度
T sin(T angle) 正弦函数
T cos(T angle) 余弦函数
T tan(T angle) 正切函数
T asin(T angle) 反正弦函数
T acos(T angle) 反余弦函数
T atan(T y, T x) T atan(T y_over_x) 反正切函数

指数函数

下文中的类型T可以是float, vec2, vec3, vec4且可以逐分量操作.

方法 说明
T pow(T x, T y) 返回x的y次幂
T exp(T x) 返回x的自然指数幂
T log(T x) 返回x的自然对数 ln
T exp2(T x) 返回2的x次幂
T log2(T x) 返回2位低的对数 log2
T sqrt(T x) 开根号 √x
T inversesqrt(T x) 先开根号,在取倒数,

几何函数

下文中的类型T可以是float, vec2, vec3, vec4且可以逐分量操作.

方法 说明
float length(T x) 返回矢量x的长度
float distance(T p0,T p1) 返回p0, p1两点的距离
float dot(T x,T y) 返回x y 的点积
vec3 cross(vec3 x,vec3 y) 返回x y 的叉积
vec3 normalize(T y) 对x进行归一化,保持向量方向不变但长度变为1
vec3 faceforward(T N, T I, T Nref) 根据 矢量 N 与Nref 调整法向量
vec3 reflect(T I, T N) 返回 I - 2 dot(N,I) N, 结果是入射矢量 I 关于法向量N的 镜面反射矢量
vec3 normalize(T I, T N, float eta) 返回入射矢量I关于法向量N的折射矢量,折射率为eta