/XorwowUnity

Primary LanguageC#MIT LicenseMIT

Xorwow[1] RNG (Random Number Generator) for Unity

Installation

Released as UPM package on OpenUPM.

  • Add Scoped Registry "https://package.openupm.com"
  • Add scope "jp.nobnak" in the registry
  • Add package "Xorwow random" in Package Manager.

Usage

In Compute Shader

Sample

Include Namespaces.

using Xorwow;
using Xorwow.Extension;

Instantiate Xorwow.XorwowService class.

XorwowService _xorwow = new XorwowService(size * size);

Set Xorwow State Buffer on Compute Shader

compute.SetXorwowStateBuf(0, _xorwow);

Include Xorwow.cginc in Computer Shader

#include "Packages/jp.nobnak.random-xorwow/ShaderLibrary/Xorwow.cginc"

Get Random Value in Compute Shader.

uint randomUint = XorwowRandom(stateIndex);
float randomFloat = XorwowRandomFloat(stateIndex);

Finally, Call Dispose Method in OnDestroy()

_xorwow.Dispose();

In Fragment Shader

Sample

Include Namespaces.

using Xorwow;
using Xorwow.Extension;

Instantiate Xorwow.XorwowService class.

XorwowService _xorwow = new XorwowService(size * size);

Set Xorwow State Buffer on Material and Make it a Random Write Target

Graphics.ClearRandomWriteTargets();
mat.SetXorwowStateBuf(_xorwow);
Graphics.SetRandomWriteTarget(1, _xorwow.XorwowStateBuf); // If number of Render Targets is 1
_outputTex.DiscardContents();
Graphics.Blit(null, _outputTex, mat);
Graphics.ClearRandomWriteTargets();

Include Xorwow.cginc in Fragment Shader

#include "Packages/jp.nobnak.random-xorwow/ShaderLibrary/Xorwow.cginc"

Get Random Value in Fragment Shader

float r = XorwowRandomFloat(i);

Finally, Destroy Xorwow State Buffer in OnDestroy()

_xorwow.Dispose();

References

  1. Marsaglia, G. (2003). Xorshift RNGs. Journal Of Statistical Software, 8(14), 1–6. Retrieved from http://www.jstatsoft.org/v08/i14/paper