更新2017年7月:我做了 「僞隨機性」 更穩定
// Version 3
float random(vec2 p)
{
vec2 K1 = vec2(
23.14069263277926, // e^pi (Gelfond's constant)
2.665144142690225 // 2^sqrt(2) (Gelfondâ€「Schneider constant)
);
return fract(cos(dot(p,K1)) * 12345.6789);
}
這是版本:
float random(vec2 p)
{
// e^pi (Gelfond's constant)
// 2^sqrt(2) (Gelfond–Schneider constant)
vec2 K1 = vec2(23.14069263277926, 2.665144142690225);
//return fract(cos(mod(12345678., 256. * dot(p,K1)))); // ver1
//return fract(cos(dot(p,K1)) * 123456.); // ver2
return fract(cos(dot(p,K1)) * 12345.6789); // ver3
}
// Minified version 3:
float random(vec2 p){return fract(cos(dot(p,vec2(23.14069263277926,2.665144142690225)))*12345.6789);}
在紋理產生噪聲傳遞(通常)超過工程設計。有些時候它很方便,但是對於大多數情況,只需計算一個隨機數就簡單快捷。
由於着色器變量是獨立於每個片段的,因此它們無法在它們之間重新使用現有變量。問題就成爲如何使用「好」隨機數種子的問題之一。不合理的數字似乎符合開始的法案。那麼選擇一個好的「排列」功能只是一個'簡單'的問題。
下面是一些免費代碼做的伎倆:
// Input: It uses texture coords as the random number seed.
// Output: Random number: [0,1), that is between 0.0 and 0.999999... inclusive.
// Author: Michael Pohoreski
// Copyright: Copyleft 2012 :-)
// NOTE: This has been upgraded to version 3 !!
float random(vec2 p)
{
// We need irrationals for pseudo randomness.
// Most (all?) known transcendental numbers will (generally) work.
const vec2 r = vec2(
23.1406926327792690, // e^pi (Gelfond's constant)
2.6651441426902251); // 2^sqrt(2) (Gelfond–Schneider constant)
return fract(cos(mod(123456789., 1e-7 + 256. * dot(p,r))));
}
要理解它是如何工作的,如果我們打破公式分解成它的組成部分變得更容易想象這是怎麼回事:
const vec2 k = vec2(23.1406926327792690,2.6651441426902251);
float rnd0(vec2 uv) {return dot(uv,k); }
float rnd1(vec2 uv) { return 1e-7 + 256. + dot(uv,k); }
float rnd2(vec2 uv) { return mod(123456789., 256. * dot(uv,k)); }
float rnd3(vec2 uv) { return cos(mod(123456789., 256. * dot(uv,k))); }
// We can even tweak the formula
float rnd4(vec2 uv) { return fract(cos(mod(1234., 1024. * dot(uv,k)))); }
float rnd5(vec2 uv) { return fract(cos(mod(12345., 1024. * dot(uv,k)))); }
float rnd6(vec2 uv) { return fract(cos(mod(123456., 1024. * dot(uv,k)))); }
float rnd7(vec2 uv) { return fract(cos(mod(1234567., 1024. * dot(uv,k)))); }
float rnd8(vec2 uv) { return fract(cos(mod(12345678., 1024. * dot(uv,k)))); }
float rnd9(vec2 uv) { return fract(cos(mod(123456780., 1024. * dot(uv,k)))); }
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
mediump vec2 uv = fragCoord.xy/iResolution.xy;
float i = rnd9(uv);
fragColor = vec4(i,i,i,1.);
}
粘貼到上述:
我還創建與2層噪聲的功能,和圖2個隨機函數 「比較」 ShaderToy例如:
演示「[2TC 15]散斑交叉淡出」
「經典」隨機函數,有時也被稱爲snoise3
是這樣bad one:
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
如果你想比較「僞隨機」功能檢查Dave的Hash without sine着色器。
雖然這兩個答案都有幫助,但這個更適合我所尋找的。謝謝! – chaosTechnician 2011-03-06 03:22:31