2012-12-25 17 views
5

Jestem nowicjuszem w programowaniu OpenGL ES i próbuję debugować programowanie shaderów i zastanawiam się, czy istnieje sposób rejestrowania wartości konkretnej zmiennej. Na przykład, w programie vertex shader poniżej, chciałbym przetestować wartość zwracana przez normalny, w zasadzie, szukałem czegoś podobnego do NSLog ...Wartości rejestrów zmiennych wewnątrz modułu cieniującego wierzchołków

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; 
} 

Odpowiedz

5

zamierzam przytoczyć moje źródło przed Moja odpowiedź: inżynierowie technologii programistycznej w Imagination Technologies, firmie odpowiedzialnej za procesory GPU PowerVR na urządzeniach z systemem iOS.

Zasadniczo, shadery GLSL ES nie mogą być jeszcze poprawnie debugowane i nie ma odpowiednika NSLog lub printf. Jeśli naprawdę chcesz wejść do swojego kodu GPU, musisz użyć OpenCL, który jest raczej trudny do zrozumienia i wdrożenia, szczególnie na urządzeniu z iOS. Typowy sposób debugowania shaderów zwykle występuje w module cieniującym fragmentu, w którym wartości, które są znane jako niepoprawne, są zazwyczaj kolorowane w taki sposób, aby się wyróżniały (na przykład jaskrawy czerwony). Werteksowanie jest trudniejsze do debugowania, ale przynajmniej występuje przed modułem cieniującym i zależy głównie od atrybutów i umundurowania.

Powinieneś już znać swoje wartości dla normal i normalMatrix w swoim głównym programie bez GPU. Należy być tablicą wektorów trójwymiarowych, a drugą macierzą 3x3. Możesz je pomnożyć, znormalizować i wydrukować wynik do NSLog w pętli wewnątrz dowolnej metody twojego programu Objective-C. Da ci to tę samą wartość obliczoną przez twój moduł cieniujący i zapisaną w eyeNormal. W rzeczywistości nie widzę żadnej części twojego kodu wierzchołka modułu cieniującego, której nie można obliczyć na procesorze - to ten fragmentowy shader naprawdę sprawi ci kłopoty!

+1

Zobacz podobne pytanie: http://stackoverflow.com/questions/2508818/how-to-debug-a-glsl-shader –

+0

Dzięki za odpowiedź nauczyłem się czegoś nowego :) – Pupillam

Powiązane problemy