GLSL 3D Mise en œuvre du bruit sur les cartes graphiques ATI
Question
J'ai essayé tant de stratégies différentes pour obtenir une fonction utile de bruit et aucun d'entre eux travaillent. Alors, comment voulez-vous mettre en œuvre Perlin bruit sur une carte graphique ATI en GLSL?
Voici les méthodes que j'ai essayé: Je l'ai essayé de mettre la permutation et des données gradient dans une texture GL_RGBA 1D et appelant la fonction texture1D. Cependant, un appel à ce qui conduit la mise en œuvre de bruit à 12 appels de texture et tue le framerate.
J'ai essayé de télécharger la permutation et des données de gradient dans un tableau de vec4 uniforme, mais le compilateur ne me laisser un élément du tableau, sauf si l'indice est une constante. Par exemple:
int i = 10;
vec4 a = noise_data[i];
donnera une erreur de compilation de ceci:
ERREUR: 00h43:. Non pris en charge lorsque l'utilisation tableau temporaire indice indirect
Signification Je ne peux récupérer les données comme ceci:
vec4 a = noise_data[10];
J'ai essayé aussi la programmation du tableau directement dans le shader, mais je suis le même numéro d'index. J'entends les cartes graphiques NVIDIA seront effectivement permettre à cette méthode, mais ATI ne sera pas.
I essayé de faire une fonction qui a renvoyé une spécifique des données codées dur ponctuelles en fonction de l'indice d'entrée, mais la fonction, étant appelé 12 fois et ayant 64 if, fait le temps de liaison insupportable.
ATI ne supporte pas le « construit dans » les fonctions de bruit pour GLSL, et je ne peux pas juste Précalculer le bruit et l'importer comme une texture, parce que je traite Fractales. Cela signifie que je besoin de la précision infinie de calcul du bruit au moment de l'exécution.
La question primordiale est ...
Comment?
La solution
bruit () est bien connu pour ne pas beeing mis en œuvre ...
rouleau que vous possédez:
int c;
int Xn;
srand(int x, int y, int width){// in pixel
c = x+y*width;
};
int rand(){
Xn = (a*Xn+c)%m;
return Xn;
}
pour un et les valeurs de m, voir wikipedia
Il est pas parfait, mais souvent assez bon.
Autres conseils
Pour une meilleure répartition des valeurs aléatoires je suggère ces très bons articles:
Amusez-vous au hasard !!!
Il y a un projet sur github avec les fonctions de bruit GLSL. Il a à la fois le « classique » et les nouvelles fonctions de bruit dans 2,3 et 4D.
IOS Finalité ont la fonction de noise
mis en œuvre.
SimpleX substance de bruit peut faire ce que vous voulez.
Essayez d'ajouter #version 150 à la partie supérieure de votre shader.