ฉันจะดีบักสิ่งที่แสดงผลกับ Frame Buffer Object ใน OpenGL ได้อย่างไร


17

ฉันมีคลาวด์จุดที่กำลังแสดงผลบนหน้าจอ แต่ละจุดมีตำแหน่งและสีรวมถึงรหัส

ฉันถูกขอให้เรนเดอร์ ID สำหรับแต่ละจุดของพื้นผิวดังนั้นฉันจึงสร้าง FBO และแนบสองพื้นผิวหนึ่งสำหรับสีและหนึ่งสำหรับความลึก ฉันสร้าง VAO และ VBO ที่จำเป็นสำหรับการเรนเดอร์นอกจอและอัปโหลดตำแหน่งและ ID ของแต่ละจุด

เมื่อทำการเรนเดอร์ไปยัง FBO เสร็จแล้วฉันอ่านพิกเซลของพื้นผิวสีด้วยglReadPixels()เพื่อดูว่าค่าคือglClearColor()อะไร

มีวิธีที่ฉันสามารถดีบักสิ่งที่มันถูกแสดงกับพื้นผิวสีของ FBO ของฉัน? คำแนะนำใด ๆ ที่คุณอาจให้จะยินดีมาก

คำตอบ:


21

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

สิ่งที่ดีมากคือRenderdocซึ่งทั้งฟรีและโอเพนซอร์ส นอกจากนี้ยังได้รับการสนับสนุนอย่างแข็งขัน

อีกหนึ่งคือIntel GPAที่น่าเสียดายตามหน้าเว็บของตนรองรับได้ถึง OGL 3.3 Core

เพียงเพื่อเพิ่มอีกหนึ่งฉันเคยใช้gDEBuggerแต่มันผ่านไปนานแล้วตั้งแต่การอัพเดตครั้งล่าสุด สิ่งนี้ได้พัฒนาเป็นAMD CodeXLที่น่าเสียดายที่ฉันไม่เคยใช้


นอกจากนี้บางครั้งฉันก็มีคำสั่งที่จะถ่ายโอนข้อมูล fbo ที่ระบุไปยังรูปภาพเมื่อฉันกดแป้น มันเป็นวิธีที่มีเทคโนโลยีต่ำ
Jorge Rodriguez

มันอาจเป็นความคิดที่ดีที่จะตรวจสอบให้แน่ใจว่าคุณมีการตั้งค่าการทดสอบเชิงลึกที่ถูกต้อง
rys

ฉันยังคงใช้ gDEbugger เป็นครั้งคราวสำหรับรุ่น GL ที่เก่ากว่า CodeXL เป็นรุ่นที่ทันสมัยกว่าและพบได้ที่นี่: github.com/GPUOpen-Tools/CodeXLโปรดทราบว่ามีรายการเครื่องมือการดีบักกราฟิกที่ครอบคลุมในหน้า apitrace ที่นี่: apitrace.github.io/#links
Bim

11

ฉันทดสอบแอปพลิเคชัน / APIs / ไลบรารีหลายแห่งเพื่อรับข้อมูลจาก FBO ในแอปพลิเคชันที่ใช้ gbuffer เช่น หลังจากเดือนแห่งความทุกข์ทรมานฉันค้นพบapitraceบน Github เพื่อทำการดีบัก OpenGL, Direct3D และ WebGL ฉันใช้ใน Windows และ Linux โดยไม่มีปัญหา

ฉันหวังว่ามันจะมีประโยชน์สำหรับคุณ


7

นอกจากการตอบสนองของ cifz อีกวิธีหนึ่งในการเห็นภาพ FBOs ซึ่งไม่เสียค่าใช้รหัสมากนักคือการใช้ glBlitFramebuffer () เพื่อถ่ายโอนพิกเซลจาก framebuffer ไปยังหน้าต่าง

// XXX WARNING: Untested code follows

// Blit from fbo...
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
// ...to the front buffer.
glBindFramebuffer(GL_WRITE_FRAMEBUFFER, GL_FRONT);

GLsizei HalfWindowWidth = (GLsizei)(WindowWidth / 2.0f);
GLsizei HalfWindowHeight = (GLsizei)(WindowHeight / 2.0f);

// Blit attachment 0 to the lower-left quadrant of the window
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBlitFramebuffer(0, 0, FboWidth, FboHeight,
                  0, 0, HalfWindowWidth, HalfWindowHeight,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);

// Blit attachment 1 to the lower-right quadrant of the window
glReadBuffer(GL_COLOR_ATTACHMENT1);
glBlitFramebuffer(0, 0, FboWidth, FboHeight,
                  HalfWindowWidth, 0, WindowWidth, HalfWindowHeight,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);

// ...and so on. You can switch FBOs if you have more than one to read from.

มี "gotchas" ที่เห็นได้ชัดบางอย่างในบัฟเฟอร์ HDR ที่อาจไม่เห็นภาพแบบที่คุณคาดหวังคุณอาจไม่สามารถ "เห็น" บัฟเฟอร์ความลึก / ลายฉลุในลักษณะที่ชัดเจนและถ้าขนาดของ FBO ไม่ ไม่ตรงกับพื้นที่ที่ถูกทำให้เบลอวิธีการขยาย / ลดขนาดอาจไร้เดียงสาอย่างยิ่ง

แต่เมื่อแฮ็คสกปรกเร็วไปมันก็ค่อนข้างดี

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