web-dev-qa-db-fra.com

printf en GLSL?

En C, je peux déboguer du code comme:

fprintf(stderr, "blah: %f", some_var);

dans GLSL ... est-il possible pour moi de simplement vider une valeur dans un shader Vertex ou Fragment? Je m'en fiche si c'est lent; Je veux juste vider la valeur. Idéalement, je veux une configuration comme celle-ci:

  • état normal = exécuter le shader GLSL normalement
  • appuyez sur la touche 'd' = la prochaine image est générée en ULTRA mode lent, où les "printfs" du shader Vertex/Fragment sont exécutés et vidés.

Est-ce faisable? (Je ne me soucie pas des performances; je veux juste le faire pour une image).

Merci!

36
anon

Malheureusement, ce n'est pas possible directement. Une solution possible cependant, que je finis par utiliser beaucoup (mais je suis sûr que c'est assez courant chez les développeurs GLSL) consiste à "imprimer" les valeurs sous forme de couleurs, à la place du résultat final souhaité.

Bien sûr, cela a de nombreuses limites; pour commencer, vous devez vous assurer que votre valeur est mappée dans un (0,1.0) gamme. Des fonctions telles que mod, fract etc. s'avèrent utiles dans ces cas. Mais, en général, c'est ce que je considère comme l'équivalent "printf" dans GLSL.

23
UncleZeiv

Au lieu d'imprimer des valeurs, avez-vous pensé à essayer un débogueur GLSL?

Par exemple, glslDevil vous permettra de parcourir l'exécution de votre shader et d'examiner les variables à chaque étape.

21
John Flatness

Découvrez AMD CodeXL. Il vous permettra d'étape par image pour inspecter les valeurs d'état opengl, le code de shader et la mémoire de texture.

http://developer.AMD.com/tools-and-sdks/heterogeneous-computing/codexl/

3
Aaron Hagan