Shader Kodunda Hata Ayıklama?


13

Bir oyun motoru yazıyorum ve perspektif kamera kullandığımda siyah bir ekran görüyorum. Tam olarak neden böyle olduğunu sormayacağım çünkü paylaşmak için çok fazla kod olurdu ve açıkçası, bu sizi rahatsız etmek için bile biraz küçük bir soru.

Sorun şu ki, nasıl hata ayıklayacağımı bilmiyorum. Tüm bu değişiklikler projeksiyon matrisim ve projeksiyon matrisim iyi görünüyorsa neden işe yaramadığını bilmiyorum. İdeal olarak gölgelendiricinin hesaplamalarını yaptığı gibi çeşitli şeylerin değerlerini yazdırırdım, ancak GLSL'nin bir printf () işlevi yok.

Benim sorum şu: Sorunumu nasıl ayıklayabilirim? Düşünebildiğim tek şey, istemci tarafı kadar olabildiğince çok değeri kontrol etmek ve sonra permütasyonla programlamak, ama bunu yaptım ve hiçbir yere ulaşmadım. Ekran kartında neler olduğunu görebilmemin bir yolu var mı? Kullanabileceğim tamamen farklı bir teknik var mı?

GLSL sürüm 420 kullanıyorum (ve bu sürüme özgü özellikler), bu yüzden glslDevil'in son 2010'da güncellendiğini düşünerek bir seçenek olduğunu düşünmüyorum.

DÜZENLE

Sorunumu tamamen ilgisiz bazı hata ayıklamalarla çözmeyi başardım.

Yanıtlar:


2

GlIntercept gibi PIX benzeri ancak OpenGL için de kullanabilirsiniz. Tüm çağrıları durdurmanın ve günlüğe kaydetmenin yanında gölgelendirici kullanımını görüntülemenizi ve gölgelendiricileri çalışma zamanında düzenlemenizi sağlar. Bu son seçenek (çalışma zamanında gölgelendiricileri düzenleme) hata ayıklama sırasında son derece yararlı olabilir, çünkü bir şeyler ters gidene kadar parçalarda düzenleme yapmaya devam edebilirsiniz ve bir renk çıkararak bir değerde hata ayıklayabilirsiniz.

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


Bu yararlı görünüyor. GLSL 4.20 EDIT ile çalışıp çalışmadığını test edeceğim: birkaç nedenden dolayı işe yarayacağını sanmıyorum. Kullanılmayan ve dolayısıyla gölgelendirici kodumda olmayan birçok OpenGL özelliğine dayanır.
Avi

Ah çok kötü, o kadar eski olduğunu bilmiyordum. Yine de GLSL4.2 için bir çeşit hata ayıklayıcı olmalı. Etrafa soracağım. Bu arada, bu işe yarayabilir mi? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.

Sadece Cg gölgelendiricileri için çalışır: |
Avi

4

Emin olmasam da, NVIDIA Nsight Shader'larda hata ayıklayabilmeli, en azından önceki bir sürümde (bulabilmeniz gerekir) GLSL'yi desteklediğini düşünüyorum. Visual Studio ile oldukça iyi entegre olur, kolay değildir, ancak faydalı şeyler vardır, ancak eski sürümlerde, bir ağ üzerinden gölgelendiricilerin hatalarını ayıklamak için GPU'lu 2 makineye ihtiyacınız vardı (en son sürüm "yerel" hata ayıklamaya izin verdiğini söylüyor) . Ayrıca, yararlı bir IDE gibi görünen (ancak GLSL hata ayıklamasından yoksun) görünen Shader Designer [2] 'yi de kontrol edin.

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

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


NSight'ın gölgelendiricilerin hatalarını ayıklamak için yönetici izinleri gerektirdiğini unutmayın.
starbeamrainbowlabs

1

Ne yazık ki opengl hata ayıklama kolay değildir. İşte yararlı bulduğum şeyler:

  • her çağrıdan sonra glGetError kullanın
  • yeni hata ayıklama uzantısını kullanmaya çalışın (ARB_debug _ ???)
  • her çağrıdan sonra ekranda çizilenleri görmek için gDebugger'ı kullanın
  • her opengl komutundan sonra neler olduğunu görmek için apitrace kullanın
  • gölgelendiricinizi geçerli girdiye göre farklı renkler çıkaracak şekilde değiştirin ve neden belirli bir renk gösterdiğini anlamaya çalışın
  • çizim yeteneklerini sınırlayan her opengl işlevselliğini devre dışı bırakın: makas testi, derinlik testi, arka yüz kaldırma, vb.

1
Bu aslında soruma cevap vermiyor. İstemci tarafı OpenGL çağrılarının hata ayıklaması için yararlıdır, ancak gölgelendirici programlarında hata ayıklama için yararlı değildir. İstemci tarafı OpenGL çağrılarında hata ayıklamayı biliyorum.
Avi

1

Şahsen hala RenderMonkey kullanıyorum. Ancak, bu gerçek soru için tamamen uygun değildir, çünkü sadece gerçek bir uygulamanın cephesidir ve bu nedenle bazı garip sınırlamalar vardır. Desteği iyi ama GLSL hata ayıklamak için daha iyi bir şey bulamadım.


Ben özellikle kamera hareketi gibi şeyler kullanmıyorum gl_ModelViewProjectionMatrix değiştirme güveniyor gibi, rendermonkey burada istediğim olduğundan emin değilim.
Avi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.