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.
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? –
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