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
相关产品推荐
相关产品推荐

