2010-08-06 20 views
32

In C, posso mettere a punto un codice simile:printf in GLSL?

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

in GLSL ... C'e 'qualche cosa per me per fare uscire appena fuori un valore in un vertice o un frammento di shader? Non mi interessa se è lento; Voglio solo scaricare il valore. Idealmente, voglio una configurazione come la seguente:

  • stato normale = Shader GLSL funzionare normalmente
  • chiave
  • premere 'd' = fotogramma successivo viene generata in ULTRA modalità lenta, dove i "printfs" nel Vertex/Fragment shader vengono eseguiti e scaricati.

È possibile? (Non mi interessa le prestazioni, voglio solo farlo per un fotogramma).

Grazie!

+1

vedere [Convertire numeri in virgola mobile a cifre decimali in GLSL?] (Https://stackoverflow.com/questions/44793883/convert-floating-point-numbers-to-decimal-digits-in -glsl/44810859 # 44810859) – Rabbid76

risposta

21

Invece di stampare valori, hai pensato di provare un debugger GLSL?

Ad esempio, glslDevil consente di eseguire l'esecuzione dello shader ed esaminare le variabili ad ogni passaggio.

+0

+1 per glslDevil non ho mai sentito parlare di questo –

+0

Link is Dead: Link alternativo? – Pica

+2

@Pica Sembra che sia stato biforcato su https://github.com/GLSL-Debugger/GLSL-Debugger –

20

Purtroppo non è possibile direttamente. Tuttavia, una possibile soluzione, che finisco per usare molto (ma sono sicuro che sia piuttosto comune tra gli sviluppatori GLSL) è quella di "stampare" i valori come colori, al posto del risultato finale desiderato.

Naturalmente questo ha molte limitazioni; per prima cosa, devi assicurarti che il tuo valore sia mappato in un intervallo (0,1.0). Funziona come mod, fract, ecc., Risulta utile in questi casi. Ma, in generale, questo è quello che vedo come equivalente "printf" in GLSL.

+4

Sì. E i computer si prestano molto bene a questo. Ad esempio, molti vettori (ad es. Normale, occhio, luce) sono tre componenti. Questi possono essere emessi nei canali rosso, verde e blu. Con una quantità sorprendentemente piccola di pratica, "vedere" i vettori in questo modo è intuitivo. Non è possibile visualizzare i vettori in questo modo, anche con un debugger! – imallett

-2

Si può vedere la variabile che si desidera controllare copiando il suo valore in modo uniforme e quindi ottenere che uniforme con glGetUniformfv

+8

Secondo le specifiche, le variabili uniformi sono di sola lettura e hanno lo stesso valore tra tutti i vertici/frammenti elaborati. È possibile * non * cambiarli all'interno dello shader e in realtà aspettarsi glGetUniform per recuperare il nuovo valore assegnato! –

+5

Questa risposta non è corretta. Dalle uniformi in prospettiva shader si leggono solo i valori. Solitamente implementati dai vendor HW leggendo registri costanti (uniform block uniform) o buffer costanti (blocchi uniformi). Tuttavia, le versioni OpenGL più recenti (ES3.1/GL4.2,4.3) introducono il carico e gli archivi di immagini shader, gli atomici degli shader e i buffer di memorizzazione degli shader. Questi sono shader scrivibili. Inoltre, dopo aver emesso un'appropriata barriera, la loro memoria corrente è visibile dalla CPU. – sacygan

3

Partenza AMD CodeXL. Ti permetterà di fare un passo dopo l'altro per esaminare i valori di stato opengl, il codice shader e la memoria texture.

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

+0

Voto positivo, sì AMD CodeXL è molto adatto per questo e ha una serie di altre funzionalità come il debugging della GPU che è molto prezioso per qualsiasi sviluppatore – kiranputtur