切换至深色主题
OpenGL
重要通知
。
基本概况
GLSL(OpenGL Shading Language)
GLSL(OpenGL Shading Language):这一着色器语言完成着色器工作
- OpenGl着色语言:https://www.kancloud.cn/qihangkong/glslang-spec/1704656
- https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)
# 简介与核心思想
> [功能] 负责记录着像素点的位置和颜色。
# GLSL(OpenGL Shading Language):这一着色器语言完成着色器工作
> OpenGL着色器语言与C语言相似。
> 着色器通常分为几何着色器(Geometry Shader)、顶点着色器(Vertex Shader)、片元着色器(Fragment Shader)等等
# 基本知识
> 固定渲染管线:WebGL中不存在固定渲染管线
> 可编辑渲染管线
# GLSL向量与矩阵类型
> 基础类型:float,double, int, uint, bool
> 2D向量: vec2,dvec2, ivec2,uvec2,bvec2
> 3D向量: vec3,dvec3, ivec3,uvec3,bvec3
> 4D向量: vec4,dvec4, ivec4,uvec4,bvec4
> 矩阵类型:
# 变量-向量类型
> vecN,bvecN,ivecN,uvecN,dvecN,N表示向量维数(N=1,2,3,4)
> 含前缀b为bool向量,i为int向量,u为uint向量,d为double向量,不含前缀为float向量
> 可以通过.xyzw(直角坐标)或者.rgba(颜色分量)或者.stpq(纹理坐标)分别访问第1、2、3、4个分量,并且分量可以随其重组,构成新的向量。
# 矩阵类型
> mat2,mat3,mat4分别为2x2,3x3,4x4 float矩阵,如mat2 m=mat2(1.0,2.0,3.0,4.0);构造一个2x2的矩阵,(1.0,2.0)为第一列,(3.0,4.0)为第二列。
# 纹理类型
> sampler2D,samplerCube分别为2D纹理和立方体纹理
# 结构体
> 与C语言结构体类似
# 数组
> GLSL中只能使用一维数组。
# 变量限定符
> in和out:in和out设定变量为输入或输出,out标识的变量被送往下一着色器阶段,如果在下一阶段的in变量与该out变量相同(名称和类型都要相同),则使用该out变量的值。in和out还可以用于接口块(Interface Block),以传送一组数据,如下面示例的Interface_Block。如果片段着色器定义out vec4变量,则该变量就是最终的像素颜色。此外为方便在OpenGL中找到变量位置,可使用layout,layout(location=n)标识变量的位置,OpenGL中glVertexAttribPointer的第一个参数就是这个n的值,通过这个位置可以很方便设置顶点属性,如果没有这个标识符,则需要在OpenGL中使用glGetAttribLocation查找变量位置。
# const常量
> 表示着色器中的某个变量是恒定的常量。
# --------------------------------------- #
# 存储限定字
# --------------------------------------- #
# Uniforms变量[只读] [一致性]:将相关信息传入片元着色器
> [作用] 设定在一帧的所有绘制中相同的数据,例如光源颜色、亮度、全局变换以及透视数据等等。
> uniforn变量可以用在顶点着色器和片元着色器中,且必须是全局变量。
> 它可以是除了数组或结构体之外的任意类型。如果顶点着色器和片元着色器中声明了同名的 uniforn变量,那么它就会被两种着色器共享。
> 顶点着色器和片元着色器对其中 uniform变量的数量限制与设备有关,且各不相同。
<script type="x-shader/x-vertex" id="vertexshader">
attribute vec4 a_Position;
uniform mat4 u_MvpMatrix;
void main() {
gl_Position = u_MvpMatrix * a_Position;
}
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
void main() {
}
</script>
# Varyings变量[可变性]:将相关信息传入片元着色器
> varying变量必须是全局变量,它的任务是从顶点着色器向片元着色器传输数据。我们必须在两种着色器中声明同名、同类型的 varying变量。
> varying变量的数量限制也与设备有关,至少支持8个。
> 如果顶点着色器与片元着色器中有类型和命名都相同的varying变量,那么顶点着色器赋给该变量的值就会被自动地传入片元着色器。
# Attributes变量
> [作用] 用于存储颜色、纹理坐标以及其他需要在JavaScript代码和 vertex shader 之间互相传递的数据,表示[逐顶点]的相关信息。
> [注意] 只能出现在[顶点着色器]中,只能被声明为[全局变量]。
> attribute变量类型限制为:float、vec2、vec3、vec4、mat2、mat3、mat4。
<script type="x-shader/x-vertex" id="vertexshader">
attribute vec4 a_Position;
attribute vec4 a_Color;
varying vec4 v_Color;
void main() {
gl_Position = u_MvpMatrix * a_Position;
v_Color = a_Color;
}
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
varying vec4 v_Color;
void main() {
gl_FragColor = v_Color;
}
</script>
# 控制语句 | 与JavaScript一样
# 语句
> continue、break、discard
# 通用函数
> abs(x):x的绝对值
> sign(x):返回x的符号,用-1,0,1表示
> floor(x):小于或等于x的最接近整数
> ceil(x):大于或等于x的最接近整数
> fract(x):x的小数部分
> mod(x,y):x/y的余
> min(x,y):最小值
> max(x,y):最大值
> clamp(x,minVar,maxVar):将x限制在minVar和maxVar之间
> mix(x,y,a):x*(1-a)+y*a
> step(edge, x):x
> smoothstep(edge0, edge1, x):x <= edge0时返回0,x >=edge1返回1,否则返回介于0和1之间的值
# 三角函数
> sin(正弦), cos(余弦), tan(正切), asin(反正弦), acos(反余弦), atan(反正切)
# 指数函数
> pow(x), exp(自然指数), 1o9(自然对数), exp2(2), 1o92(以2为底对数), sqrt(开平方), inversesgrt(开平方的倒数)
# 角度函数
> radians(角度制转弧度制), degrees(弧度制转角度值)
# 指数函数
> pow(x,y) exp(x) exp2(x) x的y次方,e的x次方,2的x次方
> log(x) log2(x) e为底的对数,2为底的对数
> sqrt(x) inversesqrt(x) 平方根和平方根的倒数
# 几何函数
> length(x) 向量x的长度
> distance(x,y) 向量x到向量y的距离
> dot(x,y) 向量x和向量y的点积
> cross(x,y) 向量x和向量y的叉积
> normalize(x) 向量x标准化
> reflect (x, N) 向量x在法向量为N的面上的反射向量x–2∗dot(N, x)∗N
> faceforward(N, x,y) xy面朝向,dot(x,y)<0则返回N,否则返回-N
> refract(x,N,eta) 向量x在法向量为N,折射率为eta的平面上的折射向量
> 1ength(失量长度), distance(两点间距离),dot(内积), cross(外积),normalize(归一化), reflect(失量反射), faceforward(使向量“朝前”)
# 纹理查询函数
> texture(sampler,coord):如果是2D纹理采样,sampler为采样的纹理,coord为vec2类型的坐标;如果是立方体纹理采样,sampler为采样的立方体纹理,coord为vec3类型的坐标。
> texture2D(在二维理中获取纹素), texturecube(在立方体纹理中获取纹素),texture2Dproj( texture.2D的投影版本),
> texture2DLod( texture2D的全字塔版本), texturecubelod( texturecube的金字塔版本), texture2DprojLod( texture2DLod的投版本)
# 矩阵函数
> matrixcmpmu1t(逐元素東法)
# 矢量函数
> 1essthan(逐元素小于), essthanequa1(逐元素小于等于), greater Than(逐元素大于), greaterthanequal(逐元素大于等于), equal(逐元素相等),notEqua1(逐元素不等),any(任一元素为true则为true),al1(所有元素为true则为true),not(逐元素取补)
# 精度限定词
# 预处理和指令