You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Metal Shader Language中类似fract/floor的随机数生成函数查询

在Metal Shader Language中实现类似内置函数的随机数生成

Metal标准库并没有提供像fract、floor这类可直接调用的、返回0.0到1.0范围随机数的内置函数,但你可以自行实现简洁易用的自定义随机函数,用法和那些内置函数完全一致。

简单的单参数随机函数实现

基于三角函数的快速实现,适合对随机性要求不高的场景:

float random(float x) {
    // 通过sin函数和大数相乘生成伪随机值,再用fract取小数部分得到0.0-1.0范围
    return fract(sin(x) * 43758.5453123);
}

调用示例(和你用step的方式类似):

float randVal = random(position.x);

更稳定的哈希式随机函数

如果需要更均匀、无周期性的随机结果,可以基于整数哈希实现:

// 基础哈希函数,对输入整数进行位运算混淆
uint hash(uint x) {
    x += (x << 10u);
    x ^= (x >> 6u);
    x += (x << 3u);
    x ^= (x >> 11u);
    x += (x << 15u);
    return x;
}

// 转换为0.0-1.0范围的随机数
float random(uint x) {
    return float(hash(x)) / float(0xFFFFFFFFu);
}

扩展到2D坐标的随机函数

如果需要基于片元的UV坐标生成随机数,可以扩展为2D版本:

uint hash(uint x, uint y) {
    return hash(x ^ hash(y));
}

float random(float2 uv) {
    uint x = uint(uv.x * 10000.0);
    uint y = uint(uv.y * 10000.0);
    return float(hash(x, y)) / float(0xFFFFFFFFu);
}

以上这些自定义函数的调用方式和fract、floor完全一致,传入对应参数即可得到0.0到1.0之间的随机值。

内容的提问来源于stack exchange,提问作者JohnOfIreland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:42:10