244 votes

Comment déboguer un shader GLSL ?

J'ai besoin de déboguer un programme GLSL mais je ne sais pas comment sortir un résultat intermédiaire. Est-il possible de faire des traces de débogage (comme avec printf) avec GLSL ?

8 votes

... sans utiliser de logiciel externe comme glslDevil.

2 votes

Jetez un coup d'œil à ceci impression de débogage des variables flottantes et des textes du shader GLSL Fragment il suffit d'une seule unité de texture de rechange pour la police et l'état constant de la valeur affichée dans la zone imprimée.

161voto

Mr. Berna Points 7329

Vous ne pouvez pas facilement communiquer avec l'unité centrale à partir de GLSL. L'utilisation de glslDevil ou d'autres outils est votre meilleure chance.

Un printf nécessiterait d'essayer de revenir au CPU depuis le GPU qui exécute le code GLSL. Au lieu de cela, vous pouvez essayer d'aller de l'avant vers l'écran. Au lieu d'essayer d'afficher du texte, affichez quelque chose de visuellement distinctif à l'écran. Par exemple, vous pouvez peindre quelque chose d'une couleur spécifique seulement si vous atteignez le point de votre code où vous voulez ajouter un printf. Si vous avez besoin d'imprimer une valeur, vous pouvez définir la couleur en fonction de cette valeur.

112 votes

Et si la raison exacte pour laquelle vous voulez déboguer votre shader est que rien n'apparaît à l'écran ?

20 votes

Pourquoi voudriez-vous déboguer quoi que ce soit ? Parce que c'est du code et qu'il veut examiner les valeurs d'exécution, je me hasarderais à écrire à .....

4 votes

GLSL-Debugger est un fork open source de glslDevil.

71voto

ste3e Points 343
void main(){
  float bug=0.0;
  vec3 tile=texture2D(colMap, coords.st).xyz;
  vec4 col=vec4(tile, 1.0);

  if(something) bug=1.0;

  col.x+=bug;

  gl_FragColor=col;
}

11 votes

C'est un dispositif de débogage. Si vous voulez savoir où se trouve la position de la lumière dans la scène, par exemple, faites : if(lpos.x>100) bug=1.0. Si la position de la lumière est supérieure à 100, la scène deviendra rouge.

1 votes

Et si je n'ai aucune idée de la nature du bogue et que je veux vérifier les valeurs pour voir ce que font les mathématiques ou certains traitements. Par exemple. a est censé être supérieur à 1, inférieur à 100, carré d'un nombre premier et ainsi de suite. Dois-je vérifier toutes ces propriétés pour trouver un bug ? Et parfois, vous ne savez même pas quelles sont les valeurs censées être, la seule façon est de vérifier la valeur au moment de l'exécution et de faire les calculs restants vous-même pour vérifier si la valeur fonctionne. Et même si je mets les valeurs dans la couleur, cela ne va pas être flexible et peut prendre un jour ou quelque chose comme ça.

14voto

Nick Devereaux Points 507

Boîte à sable GLSL a été assez pratique pour moi pour les shaders.

Pas de débogage à proprement parler (ce qui a été répondu comme étant impossible) mais pratique pour voir les changements dans la sortie rapidement.

14voto

nullspace Points 554

J'ai trouvé Transformer les commentaires est un outil utile pour le débogage des vertex shaders. Vous pouvez l'utiliser pour capturer les valeurs des sorties VS, et les relire du côté du CPU, sans avoir à passer par le rasterizer.

Ici est un autre lien vers un tutoriel sur la rétroaction de transformation.

9voto

Ian Macintosh Points 302

Vous pouvez essayer ceci : https://github.com/msqrt/shader-printf qui est une implémentation appelée de manière appropriée "Simple printf functionality for GLSL".

Vous pouvez également essayer ShaderToy, et peut-être regarder une vidéo comme celle-ci ( https://youtu.be/EBrAdahFtuo ) de la chaîne YouTube "The Art of Code" où vous pouvez voir certaines des techniques qui fonctionnent bien pour le débogage et la visualisation. Je recommande vivement sa chaîne, car il écrit de très bonnes choses et a le don de présenter des idées complexes dans des formats originaux, très attrayants et faciles à digérer (sa vidéo sur Mandelbrot en est un superbe exemple) : https://youtu.be/6IWXkV82oyY )

J'espère que cette réponse tardive ne déplaira à personne, mais la question figure en bonne place dans les recherches Google sur le débogage GLSL et beaucoup de choses ont évidemment changé en 9 ans :-)

PS : D'autres alternatives pourraient également être NVIDIA nSight et AMD ShaderAnalyzer qui offrent un débogueur complet pour les shaders.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X