Kode Shader Debugging?

13

Saya sedang menulis mesin permainan, dan ketika saya menggunakan kamera perspektif saya mendapatkan layar hitam. Saya tidak akan bertanya persis mengapa ini karena akan ada banyak kode untuk dibagikan dan, terus terang, saya pikir itu adalah pertanyaan kecil bahkan mengganggu Anda semua.

Masalahnya adalah saya tidak tahu cara men-debug-nya. Semua perubahan itu adalah matriks proyeksi saya, dan jika matriks proyeksi saya terlihat bagus, saya tidak tahu mengapa itu tidak berhasil. Idealnya saya mencetak nilai-nilai dari berbagai hal sebagai shader melakukan perhitungan, tetapi GLSL tidak nyaman tidak memiliki fungsi printf ().

Jadi pertanyaan saya adalah: bagaimana cara men-debug masalah saya? Satu-satunya hal yang bisa saya pikirkan adalah memeriksa nilai sebanyak yang saya bisa sisi klien dan kemudian pemrograman dengan permutasi, tapi saya sudah melakukan itu dan tidak mendapatkan apa-apa. Apakah ada cara saya bisa melihat apa yang terjadi di kartu video? Apakah ada teknik yang sama sekali berbeda yang bisa saya gunakan?

Saya menggunakan GLSL versi 420 (dan fitur khusus untuk versi itu), jadi saya tidak berpikir bahwa glslDevil adalah pilihan, mengingat itu terakhir diperbarui pada 2010.

EDIT

Saya berhasil memecahkan masalah saya melalui beberapa debugging yang sama sekali tidak terkait.

Avi
sumber

Jawaban:

2

Anda juga dapat menggunakan program seperti glIntercept, yang seperti PIX tetapi kemudian untuk OpenGL. Di samping memotong dan mencatat semua panggilan, Anda juga dapat menampilkan penggunaan shader dan mengedit shader pada saat dijalankan. Opsi terakhir ini (mengedit shader saat runtime) bisa sangat membantu ketika melakukan debug karena Anda dapat terus mengedit bagian sampai ada yang tidak beres dan Anda dapat dengan cepat men-debug nilai dengan mengeluarkan warna.

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

Roy T.
sumber
Tampaknya memang bermanfaat. Saya akan menguji untuk melihat apakah itu bekerja dengan GLSL 4.20 EDIT: untuk beberapa alasan, saya tidak berpikir itu akan berhasil. Itu bergantung pada banyak karakteristik OpenGL yang sudah usang dan dengan demikian tidak dalam kode shader saya.
Avi
Ah sayang sekali, aku tidak tahu itu setua itu. Harus ada semacam debugger untuk GLSL4.2 sekalipun. Saya akan bertanya-tanya. Sementara itu, ini mungkin berhasil? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.
Hanya bekerja untuk shader Cg: |
Avi
4

Meskipun saya tidak yakin, NVIDIA Nsight seharusnya dapat men-debug Shader, setidaknya saya pikir itu mendukung GLSL di beberapa versi sebelumnya (yang seharusnya dapat Anda temukan). Ini terintegrasi cukup baik dengan Visual Studio, tidak mudah tetapi memiliki banyak hal berguna, tetapi dalam versi yang lebih lama Anda membutuhkan 2 mesin dengan GPU masing-masing untuk men-debug shader melalui jaringan (sementara versi terbaru mengatakan itu memungkinkan debugging "lokal") . Juga, periksa Shader Designer [2] yang tampaknya merupakan IDE yang berguna (tetapi kurang debugging GLSL).

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

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

Neenster
sumber
Perhatikan bahwa NSight memerlukan izin administrator untuk benar-benar men-debug shader.
starbeamrainbowlabs
1

Sayangnya debugging OpenGL tidak mudah. Berikut adalah hal-hal yang menurut saya berguna:

  • gunakan glGetError setelah setiap panggilan
  • coba gunakan ekstensi debug baru (ARB_debug _ ???)
  • gunakan gDebugger untuk melihat apa yang digambar di layar setelah setiap panggilan
  • gunakan apitrace untuk melihat apa yang terjadi setelah setiap perintah pembuka
  • modifikasi shader Anda untuk menghasilkan warna yang berbeda berdasarkan input saat ini dan cobalah untuk memahami mengapa itu menunjukkan warna tertentu
  • nonaktifkan setiap fungsionalitas pembuka yang membatasi kemampuan menggambar: uji gunting, uji kedalaman, pengikisan backface, dll.
menganiaya
sumber
1
Ini sebenarnya tidak menjawab pertanyaan saya. Ini membantu untuk debugging panggilan OpenGL sisi klien, tetapi tidak untuk debugging program shader. Saya tahu cara men-debug panggilan OpenGL sisi klien.
Avi
1

Secara pribadi saya masih menggunakan RenderMonkey. Namun itu tidak sepenuhnya cocok untuk pertanyaan yang tepat ini karena itu hanya fasad dari aplikasi nyata dan karenanya memiliki beberapa batasan aneh. Tidak ada dukungan, tetapi saya belum menemukan yang lebih baik untuk debugging GLSL.

Rushyo
sumber
Saya tidak yakin rendermonkey adalah yang saya inginkan di sini, terutama karena hal-hal seperti pergerakan kamera akan bergantung pada modifikasi gl_ModelViewProjectionMatrix, yang tidak saya gunakan.
Avi