gpt4 book ai didi

glsl - GLSL rand() 这一行代码的起源是什么?

转载 作者:行者123 更新时间:2023-12-03 05:03:21 32 4
gpt4 key购买 nike

我已经看到这个伪随机数生成器在着色器中使用,引用here and there around the web :

float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

它被称为“规范”,或“我在网络上某处找到的一句话”。

这个函数的由来是什么?常数值是否像它们看起来那样任意,或者它们的选择有一定的艺术性?有没有讨论一下这个函数的优点?

编辑:我遇到过的对此函数最古老的引用是 this archive from Feb '08 ,原始页面现已从网络上消失。但那里对它的讨论并不比其他地方多。

最佳答案

非常有趣的问题!

我在输入答案时试图弄清楚这一点:)首先是一个简单的使用方法:http://www.wolframalpha.com/input/?i=plot%28+mod%28+sin%28x*12.9898+%2B+y*78.233%29+*+43758.5453%2C1%29x%3D0..2%2C+y%3D0..2%29

然后让我们考虑一下我们在这里想要做什么:对于两个输入坐标 x,y,我们返回一个“随机数”。但这不是一个随机数。每次我们输入相同的 x,y 时都是相同的。这是一个哈希函数!

该函数所做的第一件事是从 2d 变为 1d。这本身并不有趣,但这些数字是经过选择的,因此它们通常不会重复。我们还有一个浮点加法。 y 或 x 还会有更多位,但数字可能只是选择正确,因此它会混合。

然后我们对黑盒 sin() 函数进行采样。这在很大程度上取决于实现!

最后,它通过乘法和取分数放大了 sin() 实现中的误差。

我认为在一般情况下这不是一个好的哈希函数。 sin() 是 GPU 上的一个数字黑匣子。通过采用几乎任何哈希函数并对其进行转换,应该可以构造一个更好的哈希函数。困难的部分是将CPU哈希中使用的典型整数运算转换为浮点(半位或32位)或定点运算,但这应该是可能的。

同样,作为哈希函数,真正的问题是 sin() 是一个黑匣子。

关于glsl - GLSL rand() 这一行代码的起源是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964279/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com