Debug del codice shader?


13

Sto scrivendo un motore di gioco e quando uso una videocamera prospettica ottengo una schermata nera. Non chiederò esattamente perché questo perché ci sarebbe molto codice da condividere e, francamente, penso che sia una domanda un po 'meschina anche per disturbare tutti.

Il problema è che non so come eseguirne il debug. Tutto ciò che cambia è la mia matrice di proiezione e se la mia matrice di proiezione sembra a posto, non so perché non funziona. Idealmente, stamperei i valori di varie cose mentre lo shader eseguiva i suoi calcoli, ma GLSL inavvertitamente non ha una funzione printf ().

Quindi la mia domanda è: come posso eseguire il debug del mio problema? L'unica cosa a cui riesco a pensare è controllare quanti più valori posso sul lato client e quindi programmare tramite permutazione, ma l'ho fatto e non sono arrivato da nessuna parte. C'è un modo per vedere cosa sta succedendo nella scheda video? Esiste una tecnica completamente diversa che potrei usare?

Sto usando GLSL versione 420 (e funzionalità specifiche per quella versione), quindi non credo che glslDevil sia un'opzione, considerando che è stato aggiornato l'ultima volta nel 2010.

MODIFICARE

Sono riuscito a risolvere il mio problema attraverso un debug completamente non correlato.

Risposte:


2

Puoi anche usare un programma come glIntercept, che è come PIX ma poi per OpenGL. Oltre all'intercettazione e alla registrazione di tutte le chiamate, ti consente anche di visualizzare l'utilizzo degli shader e di modificarli in fase di esecuzione. Quest'ultima opzione (modifica degli shader in fase di esecuzione) potrebbe essere estremamente utile durante il debug perché è possibile continuare a modificare in parti fino a quando qualcosa non va storto e si può eseguire il debug rapido di un valore emettendo un colore.

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


Questo sembra utile. Proverò a vedere se funziona con GLSL 4.20 EDIT: per alcuni motivi, non credo che funzionerà. Si basa su molte caratteristiche di OpenGL che sono deprecate e quindi non nel mio codice shader.
Avi,

Ah, peccato, non sapevo che fosse così vecchio. Tuttavia, ci deve essere una sorta di debugger per GLSL4.2. Chiederò in giro. Nel frattempo, questo potrebbe funzionare? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.

Funziona solo con shader Cg: |
Avi

4

Anche se non sono sicuro, NVIDIA Nsight dovrebbe essere in grado di eseguire il debug di Shader, almeno penso che abbia supportato GLSL in alcune versioni precedenti (che dovresti essere in grado di trovare). Si integra abbastanza bene con Visual Studio, non è facile ma ha un sacco di cose utili, ma nelle versioni precedenti erano necessarie 2 macchine con una GPU ciascuna per eseguire il debug degli shader attraverso una rete (mentre l'ultima versione dice che consente il debug "locale") . Inoltre, controlla Shader Designer [2] che sembra essere un IDE utile (ma privo di debug GLSL).

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

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


Si noti che NSight richiede le autorizzazioni di amministratore per eseguire effettivamente il debug degli shader.
starbeamrainbowlabs il

1

Sfortunatamente il debug dell'opengl non è facile. Ecco alcune cose che ho trovato utili:

  • usa glGetError dopo ogni chiamata
  • prova a usare la nuova estensione di debug (ARB_debug _ ???)
  • usa gDebugger per vedere cosa viene disegnato sullo schermo dopo ogni chiamata
  • usa apitrace per vedere cosa succede dopo ogni comando aperto
  • modifica il tuo shader per produrre colori diversi in base all'input corrente e prova a capire perché mostra un determinato colore
  • disabilita tutte le funzionalità opengl che limitano le capacità di disegno: test a forbice, test di profondità, abbattimento del backface, ecc.

1
Questo in realtà non risponde alla mia domanda. È utile per il debug delle chiamate OpenGL sul lato client, ma non per il debug dei programmi shader. So come eseguire il debug delle chiamate OpenGL sul lato client.
Avi,

1

Personalmente uso ancora RenderMonkey. Tuttavia non è del tutto adatto a questa domanda esatta perché è solo una facciata di un'app reale e quindi ha alcune strane limitazioni. È fuori supporto ma non ho trovato niente di meglio per il debug di GLSL.


Non sono sicuro che rendermonkey sia ciò che voglio qui, in particolare perché cose come il movimento della fotocamera faranno affidamento sulla modifica di gl_ModelViewProjectionMatrix, che non uso.
Avi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.