2009-06-17 7 views
6

J'écris un vertex shader pour le moment, et j'ai besoin de nombres aléatoires. Le matériel de shader Vertex n'a pas d'opérations logiques/bits, donc je ne peux pas implémenter l'un des générateurs de nombres aléatoires standards. Est-il possible de créer un générateur de nombres aléatoires en utilisant seulement l'arithmétique standard? le hasard ne doit pas être particulièrement bon!Génération de nombres aléatoires sans utiliser d'opérations sur les bits

Répondre

5

Si vous ne me dérange pas merdiques hasard, une méthode classique est

x[n+1] = (x[n] * x[n] + C) mod N 

où C et N sont des constantes, C! = 0 et C! = -2, et N est premier. C'est un générateur pseudo-aléatoire typique pour l'affacturage Pollard Rho. Essayez C = 1 et N = 8051, cela fonctionne bien.

+0

qui semble être assez aléatoire, merci! – Martin

+0

Bien sûr. Vous n'avez pas besoin d'une grande qualité statistique pour les graphiques. –

2

Les shaders Vertex ont parfois des générateurs de bruit intégrés, tels que la fonction noise() de cg.

+0

HLSL a une fonction de bruit que je pouvais utiliser: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx Cependant chaque fois que je l'ai utilisé dans le passé, il est jamais travaillé, en fait jusqu'à récemment, je crois qu'il a été marqué comme "pas encore mis en œuvre"! – Martin

2

Utilisez un linear congruential generator:

X_(n+1) = (a * X_n + c) mod m 

Ce sont pas forts, mais au moins ils sont bien connus et peuvent avoir de longues périodes. La page Wikipedia a aussi de bonnes recommandations:

La période d'un LCG général est au plus m, et pour certains choix d'une beaucoup moins que cela. Le LCG aura une période complète si et seulement si:

1. c and m are relatively prime, 
2. a - 1 is divisible by all prime factors of m, 
3. a - 1 is a multiple of 4 if m is a multiple of 4 
2

croyiez ou non, j'utilisé newX = oldx * 5 + 1 (ou une légère variation de celui-ci) dans plusieurs jeux vidéos. L'aléatoire est horrible - c'est plus une séquence brouillée qu'un générateur aléatoire. Mais parfois c'est tout ce dont vous avez besoin. Si je me souviens bien, il passe en revue tous les chiffres avant qu'il ne se répète.

Il a des caractéristiques terribles. Il ne vous donne jamais le même nombre deux fois de suite. Quelques-uns d'entre nous ont fait un tas de tests sur les variations et nous avons utilisé quelques variations dans d'autres jeux.

Nous l'avons utilisé quand il n'y avait pas de bon modulo à notre disposition. C'est juste un décalage de deux et deux ajouts (ou un multiplier par 5 et un ajout). Je ne l'utiliserais jamais de nos jours pour des nombres aléatoires - j'utiliserais un LCG - mais peut-être que cela fonctionnerait bien pour un shader où la vitesse est cruciale et votre jeu d'instructions peut être limité.

+0

hehe, c'est un RNG intéressant, le plus mathématiquement facile à comprendre que j'ai vu à coup sûr! Je vais jouer avec ça, puisque comme tu le dis, la vitesse est cruciale. – Martin

Questions connexes