Unity3D
Unity
GPU
乱数
ComputeShader

ComputeShaderで乱数の偏りを調べてみた

More than 1 year has passed since last update.

経緯

よく使うお手軽GPU乱数実装でパーティクルの位置を計算したら結構偏ってたので、以前から気になってたXorwowと比べてみた

お手軽乱数実装

float randSimple(float2 v)
{
    return frac(sin(dot(v.xy, float2(12.9898, 78.233))) * 43758.5453);
}

http://qiita.com/shimacpyon/items/d15dee44a0b8b3883f76

普段は引数に時間などの値を混ぜて使っていたので問題なかったが
今回は同じシードから同じ状態になる再現性が欲しかったので出力を入力にフィードバックするような使い方をしてたところ
かなり偏るように見えた

環境

windows10
unity5.6.1f1

比較

上がお手軽乱数で、下がXorwow
1フレームに1回乱数を計算していて、白いラインがその値、1ピクセルずつ出現数分下に溜まっていくようにしています
思ってたよりもはるかに偏ってた!

ソース

https://github.com/fuqunaga/GPURandTest

Xorwowはnobnakさんのを使わせてもらいました
https://github.com/nobnak/XorwowUnity