Đầu tiên, cần biết rằng GPU luôn đánh giá các mảnh vỡ / pixel shader trên các khối 2x2 pixel mỗi lần. (Ngay cả khi cuối cùng chỉ cần một số pixel cần được vẽ, trong khi các pixel khác nằm ngoài đa giác hoặc bị chặn - các mảnh không cần thiết được che đi thay vì được ghi ở cuối).
Đạo hàm không gian màn hình của một biến (hoặc biểu thức) v
trong trình đổ bóng của bạn là sự khác biệt về giá trị của v
(tại thời điểm đó trong mã) từ một mặt của tứ giác 2x2 pixel này sang mặt kia. I E. ddx
là giá trị của v
pixel bên phải trừ đi giá trị v
ở bên trái và tương tự cho ddy
chiều dọc.
Câu trả lời này "làm thế nào v
tăng hoặc giảm nhanh khi chúng ta di chuyển theo chiều ngang (ddx) hoặc theo chiều dọc (ddy) trên màn hình?" - I E. trong thuật ngữ tính toán, nó xấp xỉ các đạo hàm riêng của biến của bạn (gần đúng vì nó sử dụng các mẫu riêng biệt ở mỗi phân đoạn, thay vì đánh giá một cách toán học hành vi vô hạn của hàm)
Đối với đại lượng vô hướng, chúng ta cũng có thể xem đây là một vectơ độ dốc ∇v = float2(ddx(v), ddy(v))
chỉ dọc theo hướng không gian màn hình v
đang tăng nhanh nhất.
Loại thông tin này thường được sử dụng trong nội bộ để chọn một mipmap hoặc hạt nhân lọc bất đẳng hướng thích hợp cho việc tra cứu kết cấu. Ví dụ: nếu máy ảnh của tôi trông gần như song song với uv
hướng dọc của mặt phẳng sàn có kết cấu, ddy(uv.y)
sẽ rất lớn so với ddx(uv.x)
(vì trục dọc được rút gọn trên màn hình - một pixel sải dọc bao phủ một khoảng không gian kết cấu dài hơn), nói với phần cứng lấy mẫu kết cấu rằng tôi cần lọc bất đẳng hướng để làm mờ hướng kết cấu dọc hơn so với phương ngang để tránh hiện tượng răng cưa.
Đối với hầu hết các hiệu ứng đơn giản, bạn không cần sử dụng các dẫn xuất này, vì các phương pháp lấy mẫu kết cấu 2D cơ bản xử lý nó cho bạn. Nhưng như Le Comte du Merde-fou đã đề cập trong một nhận xét ở trên, khi bạn làm sai lệch các tra cứu kết cấu của mình, bạn có thể cần phải truy xuất và / hoặc xoa bóp các dẫn xuất không gian màn hình để sử dụng, để giúp phần cứng chọn bộ lọc phù hợp (ví dụ: thông qua tex2Dlod
trong HLSL)
Đề can không gian màn hình là một trường hợp như vậy, trong đó một khối 2x2 có thể bao gồm một gián đoạn bước nhảy lớn trong tọa độ kết cấu được tính toán, dẫn đến cạnh bị lem hoặc bí danh nếu bạn để hệ thống tính toán mức lọc một cách ngây thơ. Bài viết này đi vào chi tiết về tạo tác này và các cách tiếp cận để giảm thiểu nó .
Các dẫn xuất này cũng có thể thuận tiện khi bạn sử dụng các hàm nhiễu trong quá trình tạo kết cấu thủ tục. Nếu, giả sử, bạn muốn biến nhiễu thủ tục thành bản đồ bình thường, ddx & ddy chỉ đơn giản, nếu tính gần đúng, cách tính giá trị nhiễu thay đổi trong vùng lân cận của đoạn hiện tại và cách nó dốc, vì vậy bạn có thể xây dựng một bình thường thích hợp.
Các kỹ thuật để hiển thị các đường khử răng cưa hoặc các điểm nổi bật giao nhau cũng có thể sử dụng các dẫn xuất không gian màn hình, để đảm bảo độ dày / giảm là nhất quán và không phụ thuộc vào hình học hoặc góc nhìn.
Trong bài nói chuyện này về kết xuất cát trong Journey , người nói đề cập rằng họ có thể đã sử dụng các hàm phái sinh này để kiểm soát mức độ lấp lánh của cát dọc theo các cạnh ... nếu họ biết về chúng vào thời điểm đó (thay vào đó họ đã sử dụng thủ thuật mipmapping, mà dưới mui xe được cung cấp bởi các loại dẫn xuất này anyway)
Một lưu ý cuối cùng cần lưu ý: các đạo hàm không gian màn hình có thể được tính toán ở độ chính xác "thô" / độ chính xác thấp (nghĩa là một cặp đạo hàm được chia sẻ bởi cả bốn) hoặc "chính xác" / độ chính xác cao (có nghĩa là mỗi pixel được so sánh với chỉ độ tức thời của nó các lân cận trong tứ giác, có thể cho bốn cặp đạo hàm riêng biệt trên tứ giác). Nói chung là rất nhiều, nhưng nếu bạn nhận thấy bạn đang nhận được các khối 2x2 có thể nhìn thấy trong hiệu ứng của mình, thì đó là một đầu mối tốt mà bạn muốn chuyển sang độ chính xác cao / tốt. ;)
(Trong sơ đồ ở trên cùng, tôi đã sử dụng các tính toán cho các công cụ phái sinh tốt, nhưng hãy cẩn thận khi chỉ có ddx / ddy có thể mặc định là các công cụ phái sinh thô)