Làm cách nào tôi có thể gỡ lỗi những gì đang được kết xuất với Đối tượng Bộ đệm Khung trong OpenGL?


17

Tôi có một đám mây điểm đang được hiển thị trên màn hình. Mỗi điểm có vị trí và màu sắc cũng như ID.

Tôi được yêu cầu kết xuất ID cho mỗi điểm thành một kết cấu vì vậy tôi đã tạo một FBO và đính kèm hai họa tiết, một cho màu và một cho chiều sâu. Tôi đã tạo VAO và VBO cần thiết cho kết xuất ngoài màn hình này và tải lên cho từng điểm vị trí và ID của nó.

Khi kết xuất với FBO xong, tôi đọc các pixel của kết cấu màu glReadPixels()để xem các giá trị là gì, nhưng dường như tất cả chúng đều bị xóa, tức là, giá trị chúng có giống như glClearColor().

Có cách nào để tôi có thể gỡ lỗi những gì nó đang được kết xuất thành kết cấu màu của FBO của tôi không? Bất kỳ lời khuyên mà bạn có thể cung cấp đều rất hoan nghênh.

Câu trả lời:


21

Nói chung để xem những gì đang được hiển thị trong các bước khác nhau của đường ống của bạn, tôi khuyên bạn nên sử dụng một công cụ để phân tích khung. Chúng thường cung cấp cho bạn chế độ xem nội dung của từng bộ đệm cho mỗi lệnh gọi API và điều này có thể giúp bạn trong tình huống của mình.

Một cái rất tốt là Renderdoc hoàn toàn miễn phí và mã nguồn mở. Ngoài ra nó được hỗ trợ tích cực.

Một cái khác là Intel GPA mà không may, theo trang web của nó, hỗ trợ lên tới OGL 3.3 Core.

Chỉ vì muốn thêm một lần nữa, tôi đã từng sử dụng gDEBugger , nhưng nó đã trôi qua rất lâu kể từ lần cập nhật cuối cùng. Điều này đã phát triển thành AMD CodeXL mà tiếc là tôi không bao giờ sử dụng.


Ngoài ra, đôi khi tôi cũng có một lệnh sẽ chuyển một fbo được chỉ định ra một hình ảnh khi tôi nhấn một phím. Đó là cách công nghệ thấp.
Jorge Rodriguez

Đây có lẽ cũng là một ý tưởng tốt để đảm bảo bạn có thiết lập kiểm tra độ sâu phù hợp, để kết xuất vào FBO trực quan hóa của bạn.
RYS

Thỉnh thoảng tôi vẫn sử dụng gDEbugger cho các phiên bản GL cũ hơn. CodeXL là phiên bản hiện đại hơn của nó và có thể tìm thấy ở đây: github.com/GPUOpen-Tools/CodeXL Lưu ý rằng có một danh sách toàn diện các công cụ gỡ lỗi đồ họa trên trang apitrace tại đây: apitrace.github.io/#links
Bim

11

Tôi đã thử nghiệm một số ứng dụng / API / thư viện để lấy dữ liệu từ FBO trong các ứng dụng sử dụng gbuffer chẳng hạn. Sau nhiều tháng đau khổ, tôi phát hiện ra apitrace có sẵn trên Github để gỡ lỗi OpenGL, Direct3D và WebGL. Tôi đã sử dụng trong Windows và Linux mà không gặp vấn đề gì.

Tôi hy vọng điều đó có thể hữu ích cho bạn.


7

Ngoài phản hồi của cifz, một cách khác để trực quan hóa các FBO không tốn nhiều mã là sử dụng glBlitFramebuffer () để chuyển pixel từ bộ đệm khung sang cửa sổ.

// 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.

Có một vài "gotchas" rõ ràng, trong đó bộ đệm HDR có thể sẽ không trực quan hóa theo cách bạn mong đợi, có lẽ bạn không thể "nhìn thấy" bộ đệm chiều sâu / stprint theo cách rõ ràng và nếu kích thước của FBO không Không khớp với khu vực được làm mờ, phương pháp phóng đại / thu nhỏ có thể cực kỳ ngây thơ.

Nhưng khi nhanh chóng bị tấn công, nó khá tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.