一、【数据类型】:在 GLSL 中,uniform
的数据类型有很多种,主要分为以下几大类:
1. 基本数据类型
float
:浮点数int
:整数bool
:布尔值(true
或false
)
2. 向量类型
向量类型通常用于表示颜色、坐标等。
vec2
:二维向量,包含两个float
值(如 2D 纹理坐标)。vec3
:三维向量,包含三个float
值(如颜色、3D 坐标)。vec4
:四维向量,包含四个float
值(如 RGBA 颜色、齐次坐标)。
整数向量:
ivec2
:二维整数向量ivec3
:三维整数向量ivec4
:四维整数向量
布尔向量:
bvec2
:二维布尔向量bvec3
:三维布尔向量bvec4
:四维布尔向量
3. 矩阵类型
矩阵类型通常用于几何变换,例如旋转、缩放、投影变换等。
mat2
:2x2 矩阵mat3
:3x3 矩阵mat4
:4x4 矩阵
4. 纹理采样器类型
采样器用于表示纹理,可以在片元着色器中对纹理进行采样。
sampler1D
(少见):一维纹理采样器sampler2D
:二维纹理采样器(常用于 2D 纹理)sampler3D
:三维纹理采样器(3D 纹理,体积纹理)samplerCube
:立方体贴图采样器(用于环境贴图等)sampler2DShadow
:带阴影比较的二维纹理采样器(通常用于阴影贴图)
5. 数组类型
可以使用数组来定义多个 uniform
值。例如,uniform float weights[10];
是包含 10 个 float
值的数组。数组可以用于大规模数据,例如多个光源的位置。
示例
以下是一些 uniform
定义示例:
// 基本数据类型
uniform float uTime;
uniform int uCount;
// 向量类型
uniform vec3 uColor;
uniform vec4 uPosition;
// 矩阵类型
uniform mat4 uModelMatrix;
uniform mat4 uViewMatrix;
uniform mat4 uProjectionMatrix;
// 纹理采样器类型
uniform sampler2D uTexture;
// 数组类型
uniform vec3 uLightPositions[5]; // 表示5个光源位置的数组
总结
GLSL uniform
数据类型非常灵活,涵盖从简单的浮点数到复杂的矩阵和纹理采样器。这些 uniform
类型能够帮助我们在着色器中高效地进行各种运算和效果的实现。
二、【内置函数】:GLSL 中有许多内置函数,用于各种数学运算、向量操作、纹理采样等。这些函数帮助我们在 GPU 上实现复杂的计算。以下是一些常用的 GLSL 函数分类及示例:
1. 数学函数
GLSL 提供了丰富的数学函数,涵盖基础的数学运算,如三角函数、指数、对数等。
-
三角函数:
float sin(float angle); // 正弦 float cos(float angle); // 余弦 float tan(float angle); // 正切
-
反三角函数:
float asin(float x); // 反正弦 float acos(float x); // 反余弦 float atan(float y, float x); // 反正切
-
指数和对数:
float pow(float x, float y); // x 的 y 次方 float exp(float x); // e 的 x 次方 float log(float x); // 自然对数
-
根和绝对值:
float sqrt(float x); // 平方根 float abs(float x); // 绝对值
2. 向量操作函数
向量操作是 GLSL 中非常常见的运算,因为许多渲染计算都是基于向量的。
-
点积和叉积:
float dot(vec3 x, vec3 y); // 点积 vec3 cross(vec3 x, vec3 y); // 叉积
-
向量长度和归一化:
float length(vec3 x); // 计算向量长度 vec3 normalize(vec3 x); // 将向量归一化
-
插值函数:
float mix(float x, float y, float a); // 线性插值
-
反射和折射:
vec3 reflect(vec3 I, vec3 N); // 反射向量 vec3 refract(vec3 I, vec3 N, float eta); // 折射向量
3. 几何变换函数
在 3D 图形处理中,经常需要对顶点进行旋转、缩放和变换。
- 矩阵变换:直接将向量乘以矩阵,例如:
vec4 transformedPosition = modelMatrix * vec4(position, 1.0);
4. 纹理采样函数
在片元着色器中,我们通常需要采样纹理来获取纹理颜色。
-
采样函数:
vec4 texture(sampler2D sampler, vec2 coord); // 从2D纹理采样 vec4 textureCube(samplerCube sampler, vec3 coord); // 从立方体纹理采样
-
纹理 lod(细节层次):
vec4 textureLod(sampler2D sampler, vec2 coord, float lod); // 采样时指定细节层次
5. 条件函数
条件函数可用于限制值的范围或实现更复杂的条件判断。
-
最大值、最小值和取整:
float max(float x, float y); // 取最大值 float min(float x, float y); // 取最小值 float clamp(float x, float minVal, float maxVal); // 将 x 限制在 minVal 和 maxVal 范围内
-
步进函数:
float step(float edge, float x); // 如果 x >= edge 返回 1.0,否则返回 0.0 float smoothstep(float edge0, float edge1, float x); // 在 edge0 到 edge1 之间平滑过渡
6. 噪声函数(自定义)
GLSL 本身不提供噪声函数,但我们可以自己定义简单的噪声生成算法,例如经典的 Perlin 噪声或 Simplex 噪声。以下是一个简单的噪声实现示例:
float random(vec2 st) {
return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);
}
7. 其他有用的数学工具
- 矩阵插值:
mat4 mix(mat4 x, mat4 y, float a);
- 矩阵求逆:
mat4 inverse(mat4 m);
这些函数都是 GLSL 着色器中处理向量、纹理和几何运算的强大工具,可以用来高效地处理图形和光影效果。希望对你在 GLSL 编程中有所帮助!