การดีบักรหัส Shader หรือไม่


13

ฉันเขียนโปรแกรมเกมและเมื่อฉันใช้กล้องเปอร์สเปคทีฟฉันจะได้หน้าจอสีดำ ฉันจะไม่ถามว่าทำไมถึงเป็นเช่นนี้เพราะจะมีรหัสจำนวนมากที่จะแบ่งปันและตรงไปตรงมาฉันคิดว่านั่นเป็นคำถามที่เล็กน้อยมากแม้แต่จะรบกวนคุณด้วย

ปัญหาคือฉันไม่รู้วิธีแก้จุดบกพร่อง การเปลี่ยนแปลงทั้งหมดนั้นคือเมทริกซ์การฉายของฉันและถ้าเมทริกซ์การฉายของฉันดูดีฉันไม่รู้ว่าทำไมมันไม่ทำงาน ฉันควรจะพิมพ์ค่าของสิ่งต่าง ๆ ตามที่ shader ทำการคำนวณ แต่ GLSL ไม่สะดวกไม่มีฟังก์ชัน printf ()

ดังนั้นคำถามของฉันคือฉันจะแก้ปัญหาได้อย่างไร สิ่งเดียวที่ฉันคิดได้ก็คือการตรวจสอบค่ามากที่สุดเท่าที่ฉันสามารถฝั่งไคลเอ็นต์แล้วเขียนโปรแกรมโดยการเปลี่ยนแปลง แต่ฉันได้ทำไปแล้วและไม่มีที่ไหนเลย มีวิธีที่ฉันเห็นสิ่งที่เกิดขึ้นในการ์ดวิดีโอหรือไม่? มีเทคนิคที่แตกต่างอย่างสิ้นเชิงที่ฉันสามารถใช้ได้หรือไม่?

ฉันใช้ GLSL เวอร์ชัน 420 (และฟีเจอร์เฉพาะสำหรับรุ่นนั้น) ดังนั้นฉันจึงไม่คิดว่า glslDevil เป็นตัวเลือกเนื่องจากพิจารณาว่าได้รับการอัปเดตครั้งล่าสุดในปี 2010

แก้ไข

ฉันจัดการเพื่อแก้ปัญหาของฉันผ่านการดีบักที่ไม่เกี่ยวข้องอย่างสมบูรณ์

คำตอบ:


2

คุณยังสามารถใช้โปรแกรมเช่น glIntercept ซึ่งก็เหมือนกับ PIX แต่สำหรับ OpenGL ถัดจากการสกัดกั้นและการบันทึกการโทรทั้งหมดนอกจากนี้ยังช่วยให้คุณแสดงการใช้งาน Shader และแก้ไข shader ณ เวลาทำงาน ตัวเลือกสุดท้ายนี้ (การแก้ไขเงาที่รันไทม์) อาจเป็นประโยชน์อย่างมากเมื่อทำการดีบั๊กเนื่องจากคุณสามารถทำการแก้ไขในส่วนต่าง ๆ จนกว่าจะมีบางอย่างผิดปกติและคุณสามารถดีบักค่าได้อย่างรวดเร็วโดยการแสดงสี

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


ดูเหมือนจะมีประโยชน์ ฉันจะทดสอบเพื่อดูว่าใช้งานได้กับ GLSL 4.20 EDIT: ด้วยเหตุผลบางอย่างฉันไม่คิดว่ามันจะใช้งานได้ มันขึ้นอยู่กับคุณสมบัติมากมายของ OpenGL ที่เลิกใช้แล้วและไม่ได้อยู่ในรหัส shader ของฉัน
Avi

แย่มากฉันไม่ทราบว่ามันเก่า ต้องมีการดีบักเกอร์บางประเภทสำหรับ GLSL4.2 ฉันจะถามรอบ ๆ ในระหว่างนี้อาจใช้การได้หรือไม่ developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.

ใช้งานได้กับ Cg shaders เท่านั้น: |
Avi

4

แม้ว่าฉันไม่แน่ใจ NVIDIA Nsight ควรจะสามารถดีบัก Shaders ได้อย่างน้อยฉันคิดว่ามันรองรับ GLSL ในเวอร์ชันก่อนหน้าบางเวอร์ชั่น (ซึ่งคุณควรจะหาได้) มันทำงานร่วมกันได้ค่อนข้างดีกับ Visual Studio ไม่ใช่เรื่องง่าย แต่มีสิ่งที่มีประโยชน์มากมาย แต่ในรุ่นเก่าคุณจำเป็นต้องใช้ 2 เครื่องที่มี GPU แต่ละเครื่องเพื่อทำการดีบ shaders ผ่านเครือข่าย (ในขณะที่รุ่นล่าสุดบอกว่า . ตรวจสอบ Shader Designer [2] ซึ่งดูเหมือนว่าจะเป็น IDE ที่มีประโยชน์ (แต่ขาดการดีบัก GLSL)

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

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


โปรดทราบว่า NSight ต้องการสิทธิ์ผู้ดูแลระบบเพื่อตรวจแก้จุดบกพร่องจริง
starbeamrainbowlabs

1

น่าเสียดายที่การดีบัก opengl ไม่ใช่เรื่องง่าย นี่คือสิ่งที่ฉันพบว่ามีประโยชน์:

  • ใช้ glGetError หลังการโทรทุกครั้ง
  • ลองใช้ส่วนขยายการดีบักใหม่ (ARB_debug _ ???)
  • ใช้ gDebugger เพื่อดูสิ่งที่วาดบนหน้าจอหลังจากการโทรแต่ละครั้ง
  • ใช้ apitrace เพื่อดูว่าเกิดอะไรขึ้นหลังจากแต่ละคำสั่ง opengl
  • ปรับเปลี่ยน shader ของคุณเพื่อแสดงสีที่แตกต่างกันตามอินพุตปัจจุบันและพยายามเข้าใจว่าทำไมจึงแสดงสีที่แน่นอน
  • ปิดการใช้งานทุกฟังก์ชั่นของ OpenGL ที่จำกัดความสามารถในการวาดภาพ: การทดสอบกรรไกร, การทดสอบเชิงลึก, การคัดกลับด้านหลัง ฯลฯ

1
นี่ไม่ได้ตอบคำถามของฉัน มีประโยชน์สำหรับการดีบักการโทร OpenGL ฝั่งไคลเอ็นต์ แต่ไม่เหมาะสำหรับการดีบักโปรแกรม shader ฉันรู้วิธีดีบักการโทร OpenGL ฝั่งไคลเอ็นต์
Avi

1

ส่วนตัวฉันยังคงใช้ RenderMonkey อย่างไรก็ตามมันไม่เหมาะกับคำถามที่แน่นอนนี้เพราะเป็นเพียงส่วนหนึ่งของแอพจริงและมีข้อ จำกัด บางอย่าง ไม่สนับสนุน แต่ฉันไม่พบอะไรที่ดีกว่าสำหรับการดีบัก GLSL


ฉันไม่แน่ใจว่า renderermonkey คือสิ่งที่ฉันต้องการที่นี่โดยเฉพาะอย่างยิ่งเมื่อสิ่งต่าง ๆ เช่นการเคลื่อนไหวของกล้องจะต้องพึ่งพาการแก้ไข gl_ModelViewProjectMatrix ซึ่งฉันไม่ได้ใช้
Avi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.