首先threejs基于webgl的,而webgl又是OpenGL ES 的。
Shader其实就是一段执行在GPU上的程序,此程序使用OpenGL ES SL语言来编写。
常用的shader有两种:vertex shader和fragment shader(pian)
opengles_shading_language文档
-- 起始文档写的很清楚,所以简单整理下。建议查看原文档
前置
- shader会先运行vertex shader,然后运行fragment shader。
- 数据类型
| 类型 | 含义 |
|---|---|
| float&bool&int | 基本数据类型 |
| vec2 | 包含了2个浮点数的向量 |
| vec3 | 包含了3个浮点数的向量 |
| vec4 | 包含了4个浮点数的向量 |
| ivec2 | 包含了2个整数的向量 |
| ivec3 | 包含了3个整数的向量 |
| ivec4 | 包含了4个整数的向量 |
| bvec2 | 包含了2个布尔数的向量 |
| bvec3 | 包含了3个布尔数的向量 |
| bvec4 | 包含了4个布尔数的向量 |
| mat2 | 2*2维矩阵 |
| mat3 | 3*3维矩阵 |
| mat4 | 4*4维矩阵 |
| sampler1(2,3)D | 1(2,3)D纹理采样器 |
| sampler1(2,3)DShadow | |
| sampler1(2,3)DRect | |
| sampler1(2,3)DRectShadow | |
| samplerCube |
- 数据声明
- VS FS代表是否在vertex shader和fragment shader可用
| 名称 | 含义 | VS | FS |
|---|---|---|---|
| const | 只读常量 | Ture | Ture |
| attribute | 每个顶点数据的链接的数据 | Ture | False |
| varying | 顶点着色器和片段着色器之间的链接数据 | Ture | Ture |
| uniform | 着色器统一值 | Ture | Ture |
vertex shader(顶点着色器)
gl_Position
gl_PointSize
fragment shader(片元着色器)
gl_FragColor
gl_FragData
gl_PointCoord
gl_FragCoord
gl_FrontFacing
通用内置方法
| Syntax | Description |
|---|---|
| radians(degree) | 角度变弧度 |
| degrees(radian) | 弧度变角度 |
| sin(angle), cos(angle), tan(angle) | |
| asin(x) | arc sine, 返回弧度 [-PI/2, PI/2] |
| acos(x) | arc cosine,返回弧度 [0, PI] |
| atan(y, x) | arc tangent, 返回弧度 [-PI, PI] |
| atan(y/x) | arc tangent, 返回弧度 [-PI/2, PI/2] |
| pow(x, y) | x的y次方; |
| exp(x) | 指数, log(x): |
| exp2(x) | 2的x次方, |
| log2(x) | |
| sqrt(x) | x的根号 |
| inversesqrt(x) | x根号的倒数 |
| abs(x) | 绝对值 |
| sign(x) | 符号, 1, 0 或 -1 |
| floor(x) | 底部取整 |
| ceil(x) | 顶部取整 |
| fract(x) | 取小数部分 |
| mod(x, y) | 取模, x - y*floor(x/y) |
| min(x, y) | 取最小值 |
| max(x, y) | 取最大值 |
| clamp(x, min, max) | min(max(x, min), max); |
| mix(x, y, a) | x, y的线性混叠, x(1-a) + y*a; |
| step(edge, x) | 如 x |
| smoothstep(edge0, edge1, x) | threshod smooth transition时使用。 edge0<=edge0时为0.0, x>=edge1时为1.0 |
| length(x) | 向量长度 |
| distance(p0, p1) | 两点距离, length(p0-p1); |
| dot(x, y) | 点积,各分量分别相乘 后 相加 |
| cross(x, y) | 差积,x[1]y[2]-y[1]x[2], x[2]y[0] - y[2]x[0], x[0]y[1] - y[0]x[1] |
| normalize(x) | 归一化, length(x)=1; |
| faceforward(N, I, Nref) | 如 dot(Nref, I)< 0则N, 否则 -N |
| reflect(I, N) | I的反射方向, I -2dot(N, I)N, N必须先归一化 |
| refract(I, N, eta) | 折射,k=1.0-etaeta(1.0 - dot(N, I) * dot(N, I)); 如k<0.0 则0.0,否则 etaI - (etadot(N, I)+sqrt(k))*N |
| matrixCompMult(matX, matY) | 矩阵相乘, 每个分量 自行相乘, 即 r[i][j] = x[i][j]*y[i][j];矩阵线性相乘,直接用 * |
| lessThan(vecX, vecY) | 向量 每个分量比较 x < y |
| lessThanEqual(vecX, vecY) | 向量 每个分量比较 x<=y |
| greaterThan(vecX, vecY) | 向量 每个分量比较 x>y |
| greaterThanEqual(vecX, vecY) | 向量 每个分量比较 x>=y |
| equal(vecX, vecY) | 向量 每个分量比较 x==y |
| notEqual(vecX, vexY) | 向量 每个分量比较 x!=y |
| any(bvecX) | 只要有一个分量是true, 则true |
| all(bvecX) | 所有分量是true, 则true |
| not(bvecX) | 所有分量取反 |
| texture2D(sampler2D, coord) | texture lookup |
| texture2D(sampler2D, coord, bias) | LOD bias, mip-mapped texture |
| texture2DProj(sampler2D, coord) | |
| texture2DProj(sampler2D, coord, bias) | |
| texture2DLod(sampler2D, coord, lod) | |
| texture2DProjLod(sampler2D, coord, lod) | |
| textureCube(samplerCube, coord) | |
| textureCube(samplerCube, coord, bias) | |
| textureCubeLod(samplerCube, coord, lod) |











网友评论