Débogage du code Shader?


13

J'écris un moteur de jeu et lorsque j'utilise une caméra en perspective, j'obtiens un écran noir. Je ne vais pas demander exactement pourquoi c'est parce qu'il y aurait beaucoup de code à partager et, franchement, je pense que c'est une question un peu mesquine même pour vous déranger tous.

Le problème est que je ne sais pas comment le déboguer. Tout ce qui change, c'est ma matrice de projection, et si ma matrice de projection semble bien, je ne sais pas pourquoi cela ne fonctionne pas. Idéalement, j'imprimerais les valeurs de diverses choses pendant que le shader effectuait ses calculs, mais GLSL n'a pas la fonction printf ().

Ma question est donc: comment déboguer mon problème? La seule chose à laquelle je peux penser est de vérifier autant de valeurs que possible côté client, puis de programmer par permutation, mais je l'ai fait et je suis arrivé nulle part. Existe-t-il un moyen de voir ce qui se passe sur la carte vidéo? Y a-t-il une technique complètement différente que je pourrais utiliser?

J'utilise la version 420 de GLSL (et les fonctionnalités spécifiques à cette version), donc je ne pense pas que glslDevil soit une option, étant donné qu'elle a été mise à jour pour la dernière fois en 2010.

ÉDITER

J'ai réussi à résoudre mon problème grâce à un débogage complètement indépendant.

Réponses:


2

Vous pouvez également utiliser un programme comme glIntercept, qui est comme PIX mais ensuite pour OpenGL. Outre l'interception et la journalisation de tous les appels, il vous permet également d'afficher l'utilisation des shaders et de modifier les shaders au moment de l'exécution. Cette dernière option (éditer les shaders lors de l'exécution) pourrait être extrêmement utile lors du débogage car vous pouvez continuer à éditer en plusieurs parties jusqu'à ce que quelque chose se passe mal et vous pouvez rapidement déboguer une valeur en sortant une couleur.

http://code.google.com/p/glintercept/


Cela semble utile. Je vais tester pour voir si cela fonctionne avec GLSL 4.20 EDIT: pour plusieurs raisons, je ne pense pas que cela fonctionnera. Il s'appuie sur de nombreuses caractéristiques d'OpenGL qui sont obsolètes et donc pas dans mon code de shader.
Avi

Ah dommage, je ne savais pas que c'était si vieux. Il doit cependant y avoir une sorte de débogueur pour GLSL4.2. Je vais demander autour. En attendant, cela pourrait fonctionner? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.

Fonctionne uniquement pour les shaders Cg: |
Avi

4

Bien que je ne sois pas sûr, NVIDIA Nsight devrait être en mesure de déboguer les Shaders, au moins je pense qu'il supportait GLSL dans une version précédente (que vous devriez pouvoir trouver). Il s'intègre assez bien à Visual Studio, n'est pas facile mais a beaucoup de choses utiles, mais dans les anciennes versions, vous aviez besoin de 2 machines avec un GPU chacune pour déboguer les shaders via un réseau (tandis que la dernière version dit qu'elle permet le débogage "local") . Vérifiez également Shader Designer [2] qui semble être un IDE utile (mais sans débogage GLSL).

[1] http://developer.nvidia.com/content/nvidia-nsight-visual-studio-edition

[2] http://www.opengl.org/sdk/tools/ShaderDesigner/


Notez que NSight nécessite des autorisations d'administrateur pour réellement déboguer les shaders.
starbeamrainbowlabs

1

Malheureusement, le débogage d'Opengl n'est pas facile. Voici des choses que j'ai trouvées utiles:

  • utilisez glGetError après chaque appel
  • essayez d'utiliser la nouvelle extension de débogage (ARB_debug _ ???)
  • utilisez gDebugger pour voir ce qui est dessiné à l'écran après chaque appel
  • utilisez apitrace pour voir ce qui se passe après chaque commande opengl
  • modifiez votre shader pour produire différentes couleurs en fonction de l'entrée actuelle et essayez de comprendre pourquoi il montre une certaine couleur
  • désactiver toutes les fonctionnalités opengl qui limitent les capacités de dessin: test de ciseaux, test de profondeur, abattage de face arrière, etc.

1
Cela ne répond pas vraiment à ma question. Il est utile pour déboguer les appels OpenGL côté client, mais pas pour déboguer les programmes de shader. Je sais comment déboguer les appels OpenGL côté client.
Avi

1

Personnellement, j'utilise toujours RenderMonkey. Cependant, il ne convient pas entièrement à cette question exacte car il ne s'agit que de la façade d'une véritable application et présente donc des limitations étranges. C'est bien hors du support mais je n'ai tout simplement rien trouvé de mieux pour déboguer GLSL.


Je ne suis pas sûr que rendermonkey soit ce que je veux ici, d'autant plus que des choses comme le mouvement de la caméra vont s'appuyer sur la modification de gl_ModelViewProjectionMatrix, que je n'utilise pas.
Avi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.