Debugowanie kodu modułu cieniującego?

13

Piszę silnik gry, a kiedy używam kamery perspektywicznej, pojawia się czarny ekran. Nie zamierzam pytać dokładnie, dlaczego tak jest, ponieważ byłoby dużo kodu do dzielenia się i, szczerze mówiąc, myślę, że to trochę drobnostka, które może nawet niepokoić was wszystkich.

Problem polega na tym, że nie wiem, jak to debugować. Wszystkie te zmiany to moja matryca projekcyjna, a jeśli moja matryca projekcyjna wygląda dobrze, nie wiem, dlaczego to nie działa. Idealnie wydrukowałbym wartości różnych rzeczy, ponieważ moduł cieniujący wykonał swoje obliczenia, ale GLSL niedogodnie nie ma funkcji printf ().

Więc moje pytanie brzmi: jak mogę debugować mój problem? Jedyne, co mogę wymyślić, to sprawdzenie jak największej liczby wartości po stronie klienta, a następnie programowanie za pomocą permutacji, ale zrobiłem to i nic nie osiągnąłem. Czy mogę sprawdzić, co dzieje się na karcie graficznej? Czy mogę zastosować inną technikę?

Używam GLSL w wersji 420 (i funkcji specyficznych dla tej wersji), więc nie sądzę, że glslDevil jest opcją, biorąc pod uwagę, że została ostatnio zaktualizowana w 2010 roku.

EDYTOWAĆ

Udało mi się rozwiązać mój problem za pomocą całkowicie niepowiązanego debugowania.

Avi
źródło

Odpowiedzi:

2

Możesz także użyć programu takiego jak glIntercept, który jest podobny do PIX, ale potem do OpenGL. Oprócz przechwytywania i rejestrowania wszystkich połączeń pozwala także wyświetlić użycie modułu cieniującego i edytować moduły cieniujące w czasie wykonywania. Ta ostatnia opcja (edycja modułów cieniujących w czasie wykonywania) może być niezwykle pomocna podczas debugowania, ponieważ możesz kontynuować edycję w częściach, aż coś pójdzie nie tak, i możesz szybko debugować wartość, wysyłając kolor.

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

Roy T.
źródło
To wydaje się przydatne. Sprawdzę, czy działa z GLSL 4.20 EDIT: z kilku powodów nie sądzę, żeby zadziałało. Opiera się on na wielu cechach OpenGL, które są przestarzałe, a zatem nie w moim kodzie modułu cieniującego.
Avi
Ach, szkoda, nie wiedziałem, że to było tak stare. Jednak musi być jakiś debugger dla GLSL4.2. Zapytam się W międzyczasie może to zadziałać? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.
Działa tylko w przypadku shaderów Cg: |
Avi,
4

Chociaż nie jestem pewien, NVIDIA Nsight powinien być w stanie debugować Shadery, przynajmniej myślę, że obsługiwał GLSL w niektórych poprzednich wersjach (które powinieneś być w stanie znaleźć). Całkiem dobrze integruje się z Visual Studio, nie jest łatwe, ale zawiera mnóstwo przydatnych rzeczy, ale w starszych wersjach potrzebowałeś 2 komputerów z GPU, aby debugować shadery przez sieć (podczas gdy najnowsza wersja mówi, że pozwala na "lokalne" debugowanie) . Sprawdź także Shader Designer [2], który wydaje się być użytecznym IDE (ale bez debugowania GLSL).

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

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

Neenster
źródło
Zauważ, że NSight wymaga uprawnień administratora, aby faktycznie debugować shadery.
starbeamrainbowlabs
1

Niestety debugowanie OpenGL nie jest łatwe. Oto rzeczy, które uznałem za przydatne:

  • używaj glGetError po każdym wywołaniu
  • spróbuj użyć nowego rozszerzenia debugowania (ARB_debug _ ???)
  • użyj gDebugger, aby zobaczyć, co jest rysowane na ekranie po każdym połączeniu
  • użyj apitrace, aby zobaczyć, co dzieje się po każdym poleceniu opengl
  • zmodyfikuj swój moduł cieniujący, aby wyświetlał różne kolory w oparciu o bieżące dane wejściowe i spróbuj zrozumieć, dlaczego pokazuje określony kolor
  • wyłącz wszystkie funkcje OpenGL, które ograniczają możliwości rysowania: test nożycowy, test głębokości, wybrzuszanie tylnej powierzchni itp.
zmasakrować
źródło
1
To nie odpowiada na moje pytanie. Jest to przydatne do debugowania wywołań OpenGL po stronie klienta, ale nie do debugowania programów cieniujących. Wiem, jak debugować wywołania OpenGL po stronie klienta.
Avi,
1

Osobiście nadal używam RenderMonkey. Jednak nie jest to w pełni odpowiednie do tego dokładnego pytania, ponieważ jest to tylko fasada prawdziwej aplikacji, a zatem ma pewne dziwne ograniczenia. Nie ma wsparcia, ale po prostu nie znalazłem nic lepszego do debugowania GLSL.

Rushyo
źródło
Nie jestem pewien, czy chcę tutaj rendermonkey, zwłaszcza że ruchy kamery polegają na modyfikacji gl_ModelViewProjectionMatrix, której nie używam.
Avi,