Tóm tắt

Depth bias trong rasterizer state của Direct3D điều chỉnh giá trị độ sâu của primitive khi rasterization, hữu ích khi hai bề mặt gần đồng phẳng cạnh tranh trong depth buffer và tạo z-fighting. Đây không phải là cách sửa mọi lỗi bóng hay độ sâu; tác dụng phụ thuộc các trường bias, độ dốc của primitive và cấu hình depth. Tài liệu Microsoft mô tả trạng thái rasterizer Direct3D, không phải một quy tắc chung cho mọi API đồ họa.

Điểm chính

  1. Depth bias tác động đến độ sâu của primitive trong pipeline rasterization của Direct3D.
  2. Một tình huống thường gặp là hai bề mặt gần đồng phẳng khiến giá trị depth cạnh tranh và hình ảnh nhấp nháy.
  3. Bias có thể bao gồm thành phần cố định và thành phần theo độ dốc; ý nghĩa chính xác phụ thuộc tài liệu Direct3D.
  4. Đẩy độ sâu quá nhiều có thể làm thay đổi kết quả che khuất, vì vậy cần thử với nội dung và cấu hình cụ thể.
  5. Rasterizer state, depth clipping và fill mode được mô tả trong ngữ cảnh Direct3D, không đại diện cho mọi API đồ họa.

Depth bias nằm ở đâu trong pipeline?

Trong Direct3D, rasterizer stage nhận primitive sau các giai đoạn trước đó, biến chúng thành các mẫu/pixel và tham gia tạo giá trị độ sâu được dùng về sau. Rasterizer state chứa các lựa chọn liên quan đến cách rasterize, trong đó có depth bias cùng những trường như fill mode hoặc culling. Tài liệu Microsoft mô tả stage và trạng thái này theo thuật ngữ Direct3D; vì vậy tên trường và ngữ nghĩa cần được đọc trong đúng API. [1] Depth bias không phải một lớp phủ hình ảnh hay một thao tác sửa trực tiếp texture. Nó điều chỉnh độ sâu do rasterization tạo ra, từ đó có thể ảnh hưởng phép kiểm tra độ sâu tiếp theo.

Vấn đề nào thường khiến người ta dùng bias?

Khi hai bề mặt gần như trùng mặt phẳng, giá trị depth tại các vị trí tương ứng có thể rất sát nhau. Do độ chính xác hữu hạn và khác biệt trong phép tính, một bề mặt lúc thì được xem là ở trước, lúc thì ở sau; biểu hiện thường gọi là z-fighting, có thể thấy như vùng nhấp nháy hoặc hoa văn không ổn định. Depth bias có thể dịch giá trị độ sâu của một primitive để tách hai bề mặt trong phép so sánh. Tuy nhiên, chẩn đoán cần xác nhận hai bề mặt thực sự nằm gần đồng phẳng; nếu lỗi đến từ hình học, ma trận, near/far plane hay cấu hình depth khác, bias có thể che triệu chứng chứ không xử lý nguyên nhân.

Illustration: Vấn đề nào thường khiến người ta Decorative illustration for the section "Vấn đề nào thường khiến người ta"; visual only, carries no data.

Thành phần cố định và thành phần theo độ dốc

Tài liệu Direct3D phân biệt các cách đóng góp vào độ sâu bias, gồm thành phần cố định và hệ số tỷ lệ theo độ dốc. Thành phần độ dốc phản ánh mức biến thiên độ sâu trên primitive; khi bề mặt nghiêng mạnh theo màn hình, một độ dịch cố định có thể không tương đương với trường hợp bề mặt gần phẳng. Một số cấu hình còn có giới hạn/clamp cho bias theo quy tắc API. Vì độ sâu phụ thuộc định dạng depth và pipeline, không nên coi một giá trị nguyên là khoảng cách thế giới có ý nghĩa phổ quát. Hãy đọc đơn vị, công thức và hành vi chính xác theo phiên bản tài liệu Direct3D đang dùng, thay vì sao chép một con số từ dự án khác.

Điều chỉnh thế nào để tránh tác dụng phụ?

Bắt đầu bằng một cảnh tối giản gồm hai bề mặt gần đồng phẳng và quan sát hiện tượng ban đầu. Sau đó thay đổi từng trường bias với bước nhỏ, giữ nguyên phần còn lại của pipeline và ghi lại cấu hình. Kiểm tra cả bề mặt cần ưu tiên lẫn những vật thể ở phía sau: bias quá lớn có thể khiến bề mặt được đẩy vượt qua hình học khác hoặc làm bóng/che khuất thiếu tự nhiên. Nếu vấn đề xuất hiện trong shadow mapping, xác định liệu bias đang áp dụng cho hình học rasterize trong pass nào; không gộp mọi hiện tượng bóng thành cùng một nguyên nhân. Một phép thử có kiểm soát dễ phát hiện hơn việc tăng nhiều thông số cùng lúc.

Illustration: Điều chỉnh thế nào để tránh tác Decorative illustration for the section "Điều chỉnh thế nào để tránh tác"; visual only, carries no data.

Giới hạn về phạm vi API

Các thuật ngữ rasterizer state, trường bias, depth clipping và fill mode trong tài liệu này thuộc Direct3D. API đồ họa khác có thể cung cấp chức năng gần giống nhưng tên gọi, công thức, giai đoạn áp dụng và giới hạn không nhất thiết giống nhau. Vì thế, bài viết không đưa ra khuyến nghị số cụ thể cho mọi engine hay GPU. Khi đọc mã nguồn hoặc tài liệu của một dự án, hãy xác định API và phiên bản trước, rồi đối chiếu cách trạng thái được cấu hình ở pass liên quan. Tài liệu API giải thích cơ chế, chứ không phải benchmark hiệu năng cho một trò chơi.

Theo dõi nội dung thể thao

Để chuyển từ pipeline đồ họa sang một chủ đề thể thao khác, bạn có thể xem <a href="https://www.klive68.com/">Trải nghiệm các giải bóng rổ hấp dẫn tại KLIVE</a>. Thông tin được hiển thị có thể thay đổi theo thời điểm; bài giải thích Direct3D này không xác nhận tình trạng phát sóng hay danh sách trận cụ thể.

Illustration: Theo dõi nội dung thể Decorative illustration for the section "Theo dõi nội dung thể"; visual only, carries no data.

Nguồn tham khảo

  1. Microsoft Learn — Rasterizer stage

Câu hỏi thường gặp

Depth bias có thể giúp giảm z-fighting không?

Có thể hữu ích khi các bề mặt gần đồng phẳng cạnh tranh trong depth buffer, nhưng cần xác nhận nguyên nhân và kiểm tra tác dụng phụ.

Depth bias có phải khoảng cách cố định trong thế giới 3D không?

Không nên hiểu như vậy. Cách tính có thể gồm thành phần cố định và thành phần theo độ dốc trong Direct3D; độ sâu phụ thuộc cấu hình pipeline.

Có thể dùng cùng giá trị depth bias cho mọi API không?

Không. Tài liệu ở đây nói về Direct3D; API khác có thể dùng trường, đơn vị và quy tắc khác.

Tăng bias nhiều có luôn tốt hơn không?

Không. Bias quá lớn có thể làm dịch độ sâu quá xa và tạo lỗi che khuất khác. Hãy thử có kiểm soát trên cảnh đại diện.