2012-12-25 6 views
5

Sono nuovo di programmazione OpenGL ES e sto cercando di eseguire il debug mia programmazione degli shader e mi chiedo se non v'è alcun modo per registrare il valore di una particolare variabile. Ad esempio, nel programma di vertex shader di seguito, vorrei verificare il valore restituito da normale, in fondo, ero alla ricerca di qualcosa di simile a NSLog ...valori registro delle variabili all'interno del vertex shader

attribute vec4 position; 
attribute vec3 normal; 
attribute vec2 texture; 
varying vec2 v_texCoord; 
varying float LightIntensity; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat3 normalMatrix; 

void main() 
{ 
    vec3 eyeNormal = normalize(normalMatrix * normal); 
    vec3 lightPosition = vec3(-1.0, 0.0, 3.0); 

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); 
    LightIntensity = nDotVP; 

    v_texCoord = texture; 

    gl_Position = modelViewProjectionMatrix * position; 
} 

risposta

5

ho intenzione di citare la mia fonte prima la mia risposta: The Developer Technology Engineers presso Imagination Technologies, la società responsabile delle GPU PowerVR su dispositivi iOS.

In sostanza, shaders GLSL ES non possono eseguire il debug correttamente appena ancora e non v'è alcun equivalente NSLog o printf. Se davvero si vuole fare un passo dentro il codice GPU, è necessario utilizzare OpenCL che è piuttosto difficile da comprendere e mettere in atto, in particolare su un dispositivo iOS. Un modo comune per shader di debug solito si verifica nello shader frammento, dove noto essere-corretto valori sono solitamente colorati in modo da risaltare (rosso brillante esempio). Il vertex shader è più difficile da eseguire il debug, ma almeno si verifica prima dello shader di frammenti e dipende in gran parte dagli attributi e dalle uniformi.

Dovresti già conoscere i tuoi valori per normal e normalMatrix nel tuo programma principale, non GPU. Uno dovrebbe essere un array di vettori tridimensionali e l'altro una matrice 3x3. Puoi moltiplicarli, normalizzarli e stampare il risultato in NSLog all'interno di un ciclo all'interno di qualsiasi metodo del tuo programma Objective-C. Questo ti darà lo stesso valore calcolato dallo shader e memorizzato in eyeNormal. In realtà, io non vedo alcuna parte del codice vertex shader che non potevano essere calcolati sulla CPU - è lo shader frammento che non può che causare problemi!

+1

Vedere questa domanda per una discussione simile: http://stackoverflow.com/questions/2508818/how-to-debug-a-glsl-shader –

+0

Grazie per la risposta, ho imparato qualcosa di nuovo :) – Pupillam