Dẫn xuất không gian màn hình là gì và khi nào tôi sẽ sử dụng chúng?


11

Tôi thấy các hàm ddxddyglsl và các tương đương hlsl xuất hiện trong mã shader mỗi giờ. Tôi hiện đang sử dụng chúng để lập bản đồ vết sưng mà không có tiếp tuyến hoặc bitangent nhưng về cơ bản tôi đã sao chép mã. Tôi không hiểu những chức năng này thực sự là gì, chúng làm gì và khi nào tôi sẽ sử dụng chúng.

Vì vậy, câu hỏi:

  1. Các chức năng dẫn xuất không gian màn hình là gì?
  2. Những chức năng này làm gì? Các giá trị đầu vào và giá trị đầu ra
  3. Những tác dụng chúng được sử dụng phổ biến nhất cho?
  4. Loại hiệu ứng nào yêu cầu bạn nhìn về các chức năng này?

Trước đây, tôi đã từng sử dụng những thứ này cho các sợi dọc kết cấu, trong đó sợi dọc có thể khiến sai số sai được chọn cho một số mảnh; thường là một miplvel thấp hơn, vì vậy bạn có thể thấy kết cấu rất rõ ràng đang thay đổi chi tiết khi nó cong vênh. Lấy các dẫn xuất của texcoords chưa được nhận biết, sau đó tính toán sợi dọc, sau đó sử dụng tex2Dgrad / SampleGrad / textureGrad với texcoords bị cong vênh và các dẫn xuất ngăn chặn điều này xảy ra.
Maximus Minimus

@ LeComteduMerde-fou Warps kết cấu là gì? Một google nhanh chóng gợi ý bạn có nghĩa là bọc?
NeomerArcana

Không, tôi có nghĩa là cong vênh , tức là làm biến dạng kết cấu bằng cách thay đổi các kết cấu kết cấu theo thời gian.
Maximus Minimus

Xem câu hỏi liên quan này . Tôi không nghĩ rằng nó khá trùng lặp, vì câu hỏi được liên kết đang hỏi nhiều hơn về cách các chức năng này hoạt động / cách chúng được tính toán, thay vì mức độ cao hơn "cái này là gì và nó tốt cho cái gì?"
DMGregory

Xin chào Tôi rất quan tâm đến điều này Tôi hiện đang sử dụng chúng để lập bản đồ không có tiếp tuyến hoặc bitangent nhưng về cơ bản tôi đã sao chép mã. ... Tôi đã suy nghĩ về việc sử dụng nó cho điều đó ... nhưng tôi không biết làm thế nào để biến đổi các đạo hàm không gian màn hình này thành các quy tắc không gian thế giới bằng cách sử dụng một số đại số tuyến tính rẻ tiền. Có lẽ tôi cần nghịch đảo của ma trận chiếu máy ảnh.
Prokop Hapala

Câu trả lời:


12

Đầ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).

Sơ đồ minh họa các dẫn xuất trong một tam giác rasterized

Đạo hàm không gian màn hình của một biến (hoặc biểu thức) vtrong 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. ddxlà giá trị của vpixel bên phải trừ đi giá trị vở bên trái và tương tự cho ddychiều dọc.

Câu trả lời này "làm thế nào vtă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 uvhướ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 tex2Dlodtrong 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ô)


Khi bạn nói đó là sự khác biệt giữa các pixel từ một bên của khối 2x2 sang bên kia, đó là sự khác biệt về giá trị pixel hay sự khác biệt về vị trí texel? Nếu đó là sự khác biệt về giá trị, liệu nó có tổng hợp các tex ở giữa hoặc một cái gì đó không?
NeomerArcana

Đó là sự khác biệt về giá trị của đối số ( vở đây) và vì đó là hình tứ giác 2x2, không có pixel ở giữa. Vì vậy, nếu chúng ta tô màu cho phần trên cùng bên trái của hình tứ giác và v = 1 ở đó, và trong phần trên bên phải v = 4, thì ddx (v) = 3 (nói "v tăng 3 khi chúng ta di chuyển trái sang phải ")
DMGregory

Tôi vẫn không hiểu lắm. Nếu tôi đang xem ở một góc, khối 2x2 có thể không được tạo thành từ các pixel cạnh nhau trong kết cấu. Vì vậy, sự khác biệt về giá trị, đó có phải là sự khác biệt giữa hai texels được chọn hay sự khác biệt giữa hai texels được chọn khi xem xét những cái bị bỏ qua?
NeomerArcana

Quên texels - nó không lấy mẫu kết cấu. Đó là lấy giá trị theo nghĩa đen của đối số mà bạn đã truyền cho ddx hoặc ddy và so sánh giá trị đó với giá trị được truyền cho ddx hoặc ddy khi đánh giá đoạn liền kề. Nếu giá trị đó xảy ra đến từ một mẫu kết cấu, thì cũng vậy, nhưng các hàm phái sinh không có bất kỳ kiến ​​thức nào về kết cấu. Họ chỉ trừ số. Tôi sẽ thử thêm sơ đồ vào câu trả lời này khi tôi quay lại PC của mình.
DMGregory

Oh tôi nghĩ rằng tôi hiểu bây giờ. Sẽ là tuyệt vời để có được một sơ đồ nhưng tôi nghĩ rằng tôi hiểu. Đây có vẻ như là các chức năng rất hữu ích.
NeomerArcana
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.