Gỡ lỗi mã Shader?


13

Tôi đang viết một công cụ trò chơi và khi tôi sử dụng máy ảnh phối cảnh, tôi nhận được một màn hình đen. Tôi sẽ không hỏi chính xác lý do tại sao bởi vì sẽ có rất nhiều mã để chia sẻ và, thành thật mà nói, tôi nghĩ đó là một câu hỏi nhỏ thậm chí làm phiền tất cả các bạn.

Vấn đề là tôi không biết cách gỡ lỗi. Tất cả những thay đổi đó là ma trận chiếu của tôi và nếu ma trận chiếu của tôi trông ổn, tôi không biết tại sao nó không hoạt động. Lý tưởng nhất là tôi in ra các giá trị của nhiều thứ khác nhau khi trình đổ bóng đã tính toán, nhưng GLSL bất tiện không có chức năng printf ().

Vì vậy, câu hỏi của tôi là: làm thế nào để tôi gỡ lỗi vấn đề của tôi? Điều duy nhất tôi có thể nghĩ đến là kiểm tra càng nhiều giá trị càng tốt về phía khách hàng và sau đó lập trình bằng hoán vị, nhưng tôi đã làm điều đó và không đi đến đâu. Có cách nào tôi có thể thấy những gì đang xảy ra trong card màn hình không? Có một kỹ thuật hoàn toàn khác tôi có thể sử dụng?

Tôi đang sử dụng GLSL phiên bản 420 (và các tính năng dành riêng cho phiên bản đó), vì vậy tôi không nghĩ rằng glslDevil là một tùy chọn, xem xét rằng nó đã được cập nhật lần cuối vào năm 2010.

BIÊN TẬP

Tôi quản lý để giải quyết vấn đề của mình thông qua một số gỡ lỗi hoàn toàn không liên quan.

Câu trả lời:


2

Bạn cũng có thể sử dụng một chương trình như glIntercept, giống như PIX nhưng sau đó cho OpenGL. Bên cạnh việc chặn và ghi nhật ký tất cả các cuộc gọi, nó cũng cho phép bạn hiển thị việc sử dụng trình đổ bóng và chỉnh sửa các trình tạo bóng trong thời gian chạy. Tùy chọn cuối cùng này (chỉnh sửa các shader trong thời gian chạy) có thể cực kỳ hữu ích khi gỡ lỗi vì bạn có thể tiếp tục chỉnh sửa từng phần cho đến khi có sự cố và bạn có thể nhanh chóng gỡ lỗi một giá trị bằng cách xuất ra màu.

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


Điều đó có vẻ hữu ích. Tôi sẽ kiểm tra xem nó có hoạt động với GLSL 4.20 EDIT không: vì một vài lý do, tôi không nghĩ nó sẽ hoạt động. Nó phụ thuộc vào rất nhiều đặc điểm của OpenGL bị phản đối và do đó không có trong mã shader của tôi.
Avi

Thật tệ, tôi không biết nó đã cũ. Mặc dù phải có một số trình gỡ lỗi cho GLSL4.2. Tôi sẽ hỏi xung quanh. Trong khi đó, điều này có thể làm việc? developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.

Chỉ hoạt động cho các shader Cg: |
Avi

4

Mặc dù tôi không chắc chắn, NVIDIA Nsight có thể gỡ lỗi Shader, ít nhất tôi nghĩ rằng nó đã hỗ trợ GLSL trong một số phiên bản trước (mà bạn có thể tìm thấy). Nó tích hợp khá ổn với Visual Studio, không dễ nhưng có vô số thứ hữu ích, nhưng trong các phiên bản cũ hơn, bạn cần 2 máy với mỗi GPU để gỡ lỗi shader thông qua mạng (trong khi phiên bản mới nhất cho biết nó cho phép gỡ lỗi "cục bộ") . Ngoài ra, hãy kiểm tra Shader Designer [2] có vẻ là một IDE hữu ích (nhưng thiếu gỡ lỗi GLSL).

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

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


Lưu ý rằng NSight yêu cầu quyền của quản trị viên để thực sự gỡ lỗi trình đổ bóng.
starbeamrainbowlabs

1

Thật không may, gỡ lỗi opengl là không dễ dàng. Đây là những điều mà tôi thấy hữu ích:

  • sử dụng glGetError sau mỗi cuộc gọi
  • hãy thử sử dụng tiện ích mở rộng gỡ lỗi mới (ARB_debug _ ???)
  • sử dụng gDebugger để xem những gì được vẽ trên màn hình sau mỗi cuộc gọi
  • sử dụng apitrace để xem điều gì xảy ra sau mỗi lệnh opengl
  • sửa đổi shader của bạn để xuất các màu khác nhau dựa trên đầu vào hiện tại và cố gắng hiểu tại sao nó hiển thị một màu nhất định
  • vô hiệu hóa mọi chức năng opengl làm hạn chế khả năng vẽ: kiểm tra cắt kéo, kiểm tra độ sâu, loại bỏ backface, v.v.

1
Điều này không thực sự trả lời câu hỏi của tôi. Nó hữu ích để gỡ lỗi các cuộc gọi OpenGL phía máy khách, nhưng không phải để gỡ lỗi các chương trình đổ bóng. Tôi biết cách gỡ lỗi các cuộc gọi OpenGL phía máy khách.
Avi

1

Cá nhân tôi vẫn sử dụng RenderMonkey. Tuy nhiên, nó không hoàn toàn phù hợp với câu hỏi chính xác này bởi vì nó chỉ là một mặt của ứng dụng thực và do đó có một số hạn chế kỳ lạ. Nó không hỗ trợ nhưng tôi không tìm thấy gì tốt hơn để gỡ lỗi GLSL.


Tôi không chắc chắn Revermonkey là những gì tôi muốn ở đây, đặc biệt là những thứ như chuyển động của máy ảnh sẽ phụ thuộc vào việc sửa đổi gl_ModelViewProjectionMatrix, mà tôi không sử dụng.
Avi
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.