Поставщики графических процессоров предлагают несколько предложений, таких как AMD CodeXL или отладчик nSight / Linux GFX от NVIDIA, которые позволяют проходить через шейдеры, но привязаны к аппаратному обеспечению соответствующего поставщика.
Позвольте мне заметить, что, хотя они доступны в Linux, у меня всегда был небольшой успех с их использованием там. Я не могу комментировать ситуацию под Windows.
Вариант, который я недавно использовал, заключается в модульном кодировании моего шейдерного кода #includes
и ограничении включенного кода общим подмножеством GLSL и C ++ & glm .
Когда я сталкиваюсь с проблемой, я пытаюсь воспроизвести ее на другом устройстве, чтобы увидеть, является ли проблема той же самой, которая намекает на логическую ошибку (вместо проблемы с драйвером / неопределенного поведения). Существует также вероятность передачи неверных данных в графический процессор (например, с помощью неправильно связанных буферов и т. Д.), Которые я обычно исключаю либо путем отладки вывода, как в ответе cifz, либо путем проверки данных через apitrace .
Когда это логическая ошибка, я пытаюсь восстановить ситуацию с GPU на CPU, вызывая включенный код на CPU с теми же данными. Тогда я могу пройти через это на процессоре.
Опираясь на модульность кода, вы также можете попробовать написать для него unittest и сравнить результаты между запуском GPU и CPU. Однако вы должны знать, что в некоторых случаях C ++ может вести себя не так, как GLSL, что дает ложные срабатывания в этих сравнениях.
Наконец, когда вы не можете воспроизвести проблему на другом устройстве, вы можете начать копать только там, где возникает разница. Юниттесты могут помочь вам определить, где это происходит, но, в конце концов, вам, вероятно, понадобится записать дополнительную отладочную информацию из шейдера, как в ответе cifz .
А для краткого обзора приведу блок-схему моего процесса отладки:
В заключение приведу список случайных плюсов и минусов:
профессионал
- шаг через обычный отладчик
- дополнительная (часто лучше) диагностика компилятора
против