Отладка шейдерного кода?

13

Я пишу игровой движок, и когда я использую перспективную камеру, я получаю черный экран. Я не собираюсь спрашивать, почему это так, потому что было бы много кода, которым можно поделиться, и, честно говоря, я думаю, что это немного мелкий вопрос, даже если вас всех это беспокоит.

Беда в том, что я не знаю, как его отладить. Все, что меняется, это моя матрица проекций, и если моя матрица проекций выглядит нормально, я не знаю, почему она не работает. В идеале я бы распечатывал значения различных вещей, так как шейдер делал свои вычисления, но GLSL неудобно не имеет функции printf ().

Итак, мой вопрос: как мне отладить мою проблему? Единственное, о чем я могу думать, это проверить столько значений, сколько я могу на стороне клиента, а затем программировать с помощью перестановки, но я сделал это и ничего не получил. Есть ли способ узнать, что происходит на видеокарте? Могу ли я использовать совершенно другую технику?

Я использую GLSL версию 420 (и функции, специфичные для этой версии), поэтому я не думаю, что glslDevil - это вариант, учитывая, что он последний раз обновлялся в 2010 году.

РЕДАКТИРОВАТЬ

Мне удалось решить мою проблему с помощью совершенно не связанной отладки.

Avi
источник

Ответы:

2

Вы также можете использовать программу, подобную glIntercept, которая похожа на PIX, но затем для OpenGL. Помимо перехвата и регистрации всех вызовов, он также позволяет отображать использование шейдеров и редактировать шейдеры во время выполнения. Этот последний вариант (редактирование шейдеров во время выполнения) может быть чрезвычайно полезен при отладке, потому что вы можете продолжать редактировать по частям, пока что-то пойдет не так, и вы можете быстро отладить значение, выводя цвет.

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

Рой Т.
источник
Это кажется полезным. Я проверю, работает ли он с GLSL 4.20 EDIT: по нескольким причинам я не думаю, что это сработает. Он опирается на многие характеристики OpenGL, которые устарели и поэтому не включены в мой код шейдера.
Ави
Ах, очень плохо, я не знал, что это было так старо. Должен быть какой-то отладчик для GLSL4.2. Я спрошу вокруг. А пока что это может сработать? developer.nvidia.com/content/nvidia-shader-debugger#Features
Рой Т.
Работает только для шейдеров Cg: |
Ави
4

Хотя я не уверен, что NVIDIA Nsight должна быть способна отлаживать шейдеры, по крайней мере, я думаю, что она поддерживала GLSL в некоторых предыдущих версиях (которые вы должны найти). Он довольно хорошо интегрируется с Visual Studio, это не просто, но в нем есть множество полезных вещей, но в более старых версиях для отладки шейдеров через сеть требовалось 2 машины с графическим процессором, на каждом из которых (хотя в последней версии говорится, что она позволяет выполнять «локальную» отладку) , Также проверьте Shader Designer [2], который кажется полезным IDE (но без отладки GLSL).

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

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

Neenster
источник
Обратите внимание, что NSight требует прав администратора для фактической отладки шейдеров.
starbeamrainbowlabs
1

К сожалению, отладка opengl не легка. Вот что я нашел полезным:

  • используйте glGetError после каждого вызова
  • попробуйте использовать новое расширение отладки (ARB_debug _ ???)
  • используйте gDebugger, чтобы видеть, что нарисовано на экране после каждого вызова
  • используйте apitrace, чтобы увидеть, что происходит после каждой команды opengl
  • измените свой шейдер, чтобы выводить разные цвета на основе текущего ввода и попытайтесь понять, почему он показывает определенный цвет
  • отключить все функциональные возможности opengl, которые ограничивают возможности рисования: тест ножниц, тест глубины, отбор задней поверхности и т. д.
кувалда
источник
1
Это на самом деле не отвечает на мой вопрос. Это полезно для отладки вызовов OpenGL на стороне клиента, но не для отладки шейдерных программ. Я знаю, как отлаживать клиентские вызовы OpenGL.
Ави
1

Лично я все еще использую RenderMonkey. Однако это не совсем подходит для этого точного вопроса, потому что это только фасад реального приложения и, следовательно, имеет некоторые странные ограничения. Это не поддерживается, но я не нашел ничего лучшего для отладки GLSL.

Rushyo
источник
Я не уверен, что rendermonkey - это то, что мне нужно, особенно потому, что такие вещи, как движение камеры, будут полагаться на изменение gl_ModelViewProjectionMatrix, которое я не использую.
Ави