¿Debugging Shader Code?

13

Estoy escribiendo un motor de juego, y cuando uso una cámara de perspectiva me sale una pantalla negra. No voy a preguntar exactamente por qué esto se debe a que habría mucho código para compartir y, francamente, creo que es una pregunta un tanto mezquina incluso para molestarlos a todos.

El problema es que no sé cómo depurarlo. Todo lo que cambia es mi matriz de proyección, y si mi matriz de proyección se ve bien, no sé por qué no funciona. Lo ideal sería imprimir los valores de varias cosas a medida que el sombreador hizo sus cálculos, pero GLSL no tiene la función printf ().

Entonces mi pregunta es: ¿cómo depuro mi problema? Lo único que se me ocurre es verificar tantos valores como pueda del lado del cliente y luego programar por permutación, pero lo hice y no llegué a ninguna parte. ¿Hay alguna manera de ver lo que sucede en la tarjeta de video? ¿Existe una técnica completamente diferente que podría estar usando?

Estoy usando GLSL versión 420 (y características específicas de esa versión), por lo que no creo que glslDevil sea una opción, teniendo en cuenta que se actualizó por última vez en 2010.

EDITAR

Logré resolver mi problema a través de una depuración completamente no relacionada.

Avi
fuente

Respuestas:

2

También puede usar un programa como glIntercept, que es como PIX pero luego para OpenGL. Además de interceptar y registrar todas las llamadas, también le permite mostrar el uso del sombreador y editar los sombreadores en tiempo de ejecución. Esta última opción (editar los sombreadores en tiempo de ejecución) podría ser extremadamente útil al depurar porque puede seguir editando en partes hasta que algo salga mal y puede depurar rápidamente un valor generando un color.

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

Roy T.
fuente
Eso parece útil. Probaré para ver si funciona con GLSL 4.20 EDIT: por algunas razones, no creo que funcione. Se basa en muchas características de OpenGL que están en desuso y, por lo tanto, no están en mi código de sombreador.
Avi
Ah, qué pena, no sabía que era tan viejo. Sin embargo, tiene que haber algún tipo de depurador para GLSL4.2. Preguntaré por ahí. Mientras tanto, esto podría funcionar? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.
Solo funciona para sombreadores Cg: |
Avi
4

Aunque no estoy seguro, NVIDIA Nsight debería poder depurar Shaders, al menos creo que era compatible con GLSL en alguna versión anterior (que debería poder encontrar). Se integra bastante bien con Visual Studio, no es fácil pero tiene muchas cosas útiles, pero en las versiones anteriores necesitabas 2 máquinas con una GPU para depurar sombreadores a través de una red (mientras que la última versión dice que permite la depuración "local") . Además, marque Shader Designer [2], que parece ser un IDE útil (pero que carece de depuración GLSL).

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

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

Neenster
fuente
Tenga en cuenta que NSight requiere permisos de administrador para depurar sombreadores.
starbeamrainbowlabs
1

Desafortunadamente, la depuración de opengl no es fácil. Aquí hay cosas que encontré útiles:

  • use glGetError después de cada llamada
  • intente usar la nueva extensión de depuración (ARB_debug _ ???)
  • use gDebugger para ver lo que se dibuja en la pantalla después de cada llamada
  • use un apitrace para ver qué sucede después de cada comando opengl
  • modifique su sombreador para generar diferentes colores según la entrada actual e intente comprender por qué muestra un color determinado
  • deshabilite todas las funciones de opengl que limitan las capacidades de dibujo: prueba de tijera, prueba de profundidad, sacrificio de la cara posterior, etc.
mazo
fuente
1
Esto en realidad no responde a mi pregunta. Es útil para depurar llamadas OpenGL del lado del cliente, pero no para depurar los programas de sombreado. Sé cómo depurar llamadas OpenGL del lado del cliente.
Avi
1

Personalmente, sigo usando RenderMonkey. Sin embargo, no es del todo adecuado para esta pregunta exacta porque es solo una fachada de una aplicación real y, por lo tanto, tiene algunas limitaciones extrañas. Está bastante fuera de soporte, pero no he encontrado nada mejor para depurar GLSL.

Rushyo
fuente
No estoy seguro de que rendermonkey sea lo que quiero aquí, especialmente porque cosas como el movimiento de la cámara dependerán de la modificación de gl_ModelViewProjectionMatrix, que no uso.
Avi