GLSL 数据类型和内置函数

一、【数据类型】:在 GLSL 中,uniform 的数据类型有很多种,主要分为以下几大类:

1. 基本数据类型

  • float:浮点数
  • int:整数
  • bool:布尔值(truefalse

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 编程中有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值