2013-05-27 1 views
1

Existe-t-il un moyen d'exécuter une fonction une seule fois avec une sorte de vérification booléenne sur GLSL? Ou est-ce que je manque quelque chose d'important? Le code ci-dessous ne semble pas aider.Exécution d'une seule fonction GLSL une seule fois

bool once = false; 

DoOnce() 
{ 
    for (int i = 0; i < someConst; i++) 
    { 
     //do some things... 
    } 
    once = true; 
} 

void main() 
{ 
    if (!once) 
    { 
     DoOnce(); 
    } 
    //do other things   
} 

Ou dois-je utiliser un shader de calcul pour ce type de comportement?

+1

Que voulez-vous dire par "seulement une fois"? Cela * ne sera * exécuté qu'une seule fois. Par invocation de votre shader. Est-ce que vous essayez de faire quelque chose où les invocations de shader se parlent? –

+0

Si vous avez des opérations atomiques, vous pouvez les faire exécuter une seule fois (total, pas par invocation), mais il est peu probable que vous le vouliez vraiment. Pour quelque chose qui s'exécute juste une fois, il est probablement plus efficace de le faire sur le CPU. Le but de l'utilisation de GLSL est de faire fonctionner les choses plusieurs fois massivement parallèlement. – Damon

Répondre

1

Il semble que vous vouliez générer des données qui peuvent être utilisées ultérieurement par les appels de shaders, et ce n'est pas comme cela que vous le faites. @Nicol a bien sûr raison, et cette fonction s'appellera per-invocation, ce qui sera une fois pour chaque sommet pour vertex shader et ainsi de suite. En théorie, vous pouvez utiliser Transform Feedback buffer pour stocker la valeur done, mais ce n'est certainement pas une bonne solution.

Si vous voulez écrire du code GLSL générant un tel cache, séparez ce code en deux parties: la génération du cache et l'utilisation du cache. Tout d'abord, exécutez la génération de cache dans des tampons (leur type dépend des données que vous générez, que ce soit des textures, des VBO ou quelque chose de différent), puis liez et utilisez ces tampons dans le code de dessin réel. Si vous avez spécifié le contenu de la mémoire cache, je pourrais peut-être vous aider davantage avec la configuration, mais cela varie beaucoup (construction de texture/VBO, puis liaison via les attributs vertex, peut-être avec un diviseur d'instance ou un échantillonneur approprié). texture), ce ne serait qu'une supposition aveugle en ce moment.

+0

Merci, on dirait que je dois changer d'approche. – tayrak