关于glsl:GLSL

55次阅读

共计 3144 个字符,预计需要花费 8 分钟才能阅读完成。

GLSL 是学习 webgl 的必备的知识点,故整顿这篇文章

前言

GLSL Shader Example,这是一份不错的练习例子。

1. 变量

1.1 根本类型

变量类型 阐明
bool 布尔型标量数据类型
int/ivec2/ivec3/ivec4 蕴含 1/2/3/4 个整型向量
float/vec2/vec3/vec4 蕴含 1,2,3,4 个浮点型向量
sampler2D 示意 2D 纹理
samplerCube 示意立方体纹理
mat[2..3] 示意 2×2 和 3×3 的矩阵
mat4 示意 4×4 的矩阵
sampler1D 用于内建的纹理函数中援用指定的 1D 纹理的句柄。只能够作为统一变量或者函数参数应用
sampler2D 二维纹理句柄
sampler3D 三维纹理句柄
samplerCube cube map 纹理句柄
sampler1DShadow 一维深度纹理句柄
sampler2DShadow 二维深度纹理句柄

1.2 内置变量

顶点着色器 可用的内置变量如下表:

名称 类型 形容
gl_Color vec4 输出属性 - 示意顶点的主色彩
gl_SecondaryColor vec4 输出属性 - 示意顶点的辅助色彩
gl_Normal vec3 输出属性 - 示意顶点的法线值
gl_Vertex vec4 输出属性 - 示意物体空间的顶点地位
gl_MultiTexCoordn vec4 输出属性 - 示意顶点的第 n 个纹理的坐标
gl_FogCoord float 输出属性 - 示意顶点的雾坐标
gl_Position vec4 输入属性 - 变换后的顶点的地位,用于前面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。
gl_ClipVertex vec4 输入坐标,用于用户裁剪立体的裁剪
gl_PointSize float 点的大小
gl_FrontColor vec4 侧面的主色彩的 varying 输入
gl_BackColor vec4 反面主色彩的 varying 输入
gl_FrontSecondaryColor vec4 侧面的辅助色彩的 varying 输入
gl_BackSecondaryColor vec4 反面的辅助色彩的 varying 输入
gl_TexCoord[] vec4 纹理坐标的数组 varying 输入
gl_FogFragCoord float 雾坐标的 varying 输入

片段着色器 的内置变量如下表:

名称 类型 形容
gl_Color vec4 蕴含主色彩的插值只读输出
gl_SecondaryColor vec4 蕴含辅助色彩的插值只读输出
gl_TexCoord[] vec4 蕴含纹理坐标数组的插值只读输出
gl_FogFragCoord float 蕴含雾坐标的插值只读输出
gl_FragCoord vec4 只读输出,窗口的 x,y,z 和 1/w
gl_FrontFacing bool 只读输出,如果是窗口正面图元的一部分,则这个值为 true
gl_PointCoord vec2 点精灵的二维空间坐标范畴在 (0.0, 0.0) 到(1.0, 1.0)之间,仅用于点图元和点精灵开启的状况下。
gl_FragData[] vec4 应用 glDrawBuffers 输入的数据数组。不能与 gl_FragColor 联合应用。
gl_FragColor vec4 输入的色彩用于随后的像素操作
gl_FragDepth float 输入的深度用于随后的像素操作,如果这个值没有被写,则应用固定性能管线的深度值代替

2. 修饰符

变量的申明能够应用如下的修饰符:

修饰符 形容
const 常量值必须在申明时初始化。它是只读的不可批改的。
attribute 示意只读的顶点数据,只用在顶点着色器中。数据来自以后的顶点状态或者顶点数组。它必须是全局范畴申明的,不能在函数外部。一个 attribute 能够是浮点数类型的标量,向量,或者矩阵。不能够是数组或者构造体
uniform 统一变量。在着色器执行期间统一变量的值是不变的。与 const 常量不同的是,这个值在编译期间是未知的是由着色器内部初始化的。统一变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范畴进行申明。
varying 顶点着色器的输入。例如色彩或者纹理坐标,(插值后的数据)作为片段着色器的只读输出数据。必须是全局范畴申明的全局变量。能够是浮点数类型的标量,向量,矩阵。不能是数组或者构造体。
centorid varying 在没有多重采样的状况下,与 varying 是一样的意思。在多重采样时,centorid varying 在光栅化的图形外部进行求值而不是在片段核心的固定地位求值。
invariant (不变量)用于示意顶点着色器的输入和任何匹配片段着色器的输出,在不同的着色器中计算产生的值必须是统一的。所有的数据流和控制流,写入一个 invariant 变量的是统一的。编译器为了保障后果是完全一致的,须要放弃那些可能会导致不统一值的潜在的优化。除非必要,不要应用这个修饰符。在多通道渲染中防止 z -fighting 可能会应用到。
in 用在函数的参数中,示意这个参数是输出的,在函数中扭转这个值,并不会影响对调用的函数产生副作用。(相当于 C 语言的传值),这个是函数参数默认的修饰符
out 用在函数的参数中,示意该参数是输入参数,值是会扭转的。
inout 用在函数的参数,示意这个参数即是输出参数也是输入参数。

3. 数组

GLSL 中只能应用一维数组。数组的类型能够是所有根本类型或者构造体。申明形式如下:

vec4 transMatrix[4];

vec4 affineMatrix[4] = {0, 1, 2, 3};

vec4 rotateMatrix = affineMatrix;

4. 构造体

struct rotateMatrix {
  float x;

  float y;

  float z;

  float coeff[8];
}

struct positionInfo {
  vec2 coord;

  float value;

  rotateMatrix matrix;
}

5. 控制结构

5.1 循环

for (int s = 0; s < 7; s++) {
vec2 r;
r = vec2(cos(uv.y * i0 - i4 + time / i1), sin(uv.x * i0 - i4 + time / i1)) / i2;
r += vec2(-r.y, r.x) * 0.3;
uv.xy += r;

i0 *= 1.93;
i1 *= 1.15;
i2 *= 1.7;
i4 += 0.05 + 0.1 * time * i1;
}

5.2 管制语句

与 js 统一,留神没有 switch 语句,且 if 过多会耗费性能。

if(express) {}

6. 函数

6.1 自定义函数

float noise(in vec2 pt) {return snoise(pt) * 0.5 + 0.5;

}

6.2 内置函数

  • 罕用函数
语法 阐明
genType abs (genType x) x 的绝对值
genType sign (genType x) 判断 x 是负数、正数,还是零
genType floor (genType x) 返回不大于 x 的最大整数
genType ceil (genType x) 返回不小于 x 的最小整数
genType fract (genType x) 返回 x 的小数局部,即 x -floor(x)
genType mod (genType x, genType y) 返回 x – y * floor (x/y)
genType min (genType x, genType y) 返回 x 和 y 的较小值
genType max (genType x, genType y) 返回 x 和 y 的较大值
genType clamp (genType x, genType minVal, genType maxVal) min (max (x, minVal), maxVal),如果 minVal > maxVal,则返回 undefined
genType mix (genType x, genType y, genType a) 返回 x (1−a) + y a

参考文章

  • GLSL 语法简介
  • GLSL 代码
  • GL Shader Language(GLSL)详解 - 根底语法

正文完
 0