Các shader Hull, Domain và Geometry được sử dụng để làm gì?


21

Tôi đã thực hiện phần chia sẻ công bằng trò chơi 3D của mình cho chủ nhân (trước đây) và cả trong các công cụ tùy chỉnh của riêng tôi cho các trò chơi độc lập của riêng tôi.

Ban đầu, tôi bắt đầu với Direct3D 9 và D3DX9, công việc gần như đã làm mọi thứ cho tôi và không yêu cầu tôi phải suy nghĩ về các shader.

Sau đó, tôi đã viết các shader Direct3D 9 đầu tiên của mình, nhưng chủ yếu sử dụng một shader rất đơn giản cho mọi thứ tôi đã làm.

Trong lần lặp gần đây nhất của công cụ trò chơi của mình, tôi đã chuyển sang Direct3D 11 và cùng với đó tôi đã tạo ra rất nhiều shader. Tôi đã tạo ra GPU skin, các hạt tính toán GPU, rất nhiều hiệu ứng ánh sáng và xử lý bài, tất cả đều có trong GPU. Thứ thực sự mát mẻ.

Cho đến nay tôi chỉ sử dụng các shader đỉnh và pixel / mảnh. Mặc dù vẫn còn nhiều điều tôi vẫn chưa làm, tôi tin rằng tôi có kiến ​​thức vững chắc về những gì các shader đỉnh và pixel / mảnh làm được, và làm thế nào tất cả phù hợp với toàn bộ đường ống 3D.

Bắt kịp với những phát triển gần đây, tôi đã trở nên rất hứng thú với các giai đoạn đổ bóng mới hơn. Đó là, Geometry Shader, và thậm chí mới hơn, các shader Hull và Domain.

Tôi chưa bao giờ sử dụng các giai đoạn này, nhưng từ những gì tôi biết, trình tạo bóng Geometry, nếu được bật, sẽ chạy sau trình tạo bóng đỉnh, một lần cho mỗi đỉnh biến đổi (hoặc một lần trên mỗi nguyên thủy?) Và cho phép bạn loại bỏ các đỉnh (và nguyên thủy?) và tạo những cái mới (mà tôi đoán sẽ quay trở lại điểm bắt đầu của đường ống dẫn?).

Tôi đoán là việc sử dụng chính của shader hình học sẽ là tạo lập trình hình học trong GPU. Một cách sử dụng phổ biến là tạo ra các bảng quảng cáo dựa trên một đỉnh duy nhất, nhưng tôi không thực sự hình dung ra nhiều kịch bản phổ biến khác ngoài việc tạo ra các hình nhỏ và các thứ khác bạn có thể tạo lập trình 100%.

Đối với các shader Hull và Domain, có vẻ như chúng có liên quan đến tessname (tạo ra các bề mặt mịn hơn từ các bề mặt gồ ghề?), Và phải được sử dụng cùng nhau hoặc không. Thuật ngữ "bản vá" dường như cũng phổ biến ở đây.

Có ai quan tâm để giải thích cho tôi, về mặt thực tế, những giai đoạn đổ bóng mới này dùng để làm gì, làm thế nào chúng phù hợp với đường ống 3D và trong trường hợp nào tôi nên xem xét sử dụng chúng?


Tôi nghĩ rằng bạn đang hỏi sai cách - thay vì "chúng được sử dụng cho mục đích gì", bạn nên hỏi "họ làm gì" - nếu bạn hiểu các tài nguyên đã cho (và các khái niệm dưới vỏ bọc của họ) thì chỉ có bầu trời là giới hạn bạn thực sự có thể làm với họ.
wonderra

@wondra: Đây gần như là một câu hỏi, nhưng tôi muốn tập trung nhiều hơn vào các mẫu sử dụng thực tế, thay vì giải thích lý thuyết về những gì họ làm. Trên thực tế, có một cái nhìn tổng quan về MSDN mà tôi đã đọc nhiều lần, nhưng vẫn không thể hiểu họ có thể làm gì cho tôi. Tôi là một sinh vật thông minh, và tôi có thể kết nối A và B, và tìm ra C, D, E và F từ đó.
Panda Pyjama

Tôi không biết, "ví dụ sử dụng thực tế" có vẻ hơi rộng đối với tôi. Mặc dù vậy, tôi đã có một cú đâm vào nó, nhưng trước nhận xét này để nó có thể tập trung quá nhiều vào "họ làm gì" cho bạn.
Josh

@Josh: Bạn có sử dụng, hoặc bạn đã sử dụng alll các giai đoạn này trong thế giới thực?
Panda Pajama

1
Một FYI cho những người có nền tảng không trực tiếp (như bản thân tôi), hai người này được gọi là "Trình tạo bóng kiểm soát Tessname" và "Trình đánh giá đánh giá Tessname" trong OpenGL và Vulkan.
Shahbaz

Câu trả lời:


13

Thân và tên miền

Các giai đoạn vỏ và miền shader là một phần của đường dẫn tessname của GPU. Chúng thường được sử dụng để tính toán hình học bề mặt chi tiết cao dựa trên hình học bề mặt đầu vào chi tiết thấp hơn, được định nghĩa là hình tam giác hoặc hình tứ giác (et cetera). Các nguyên hàm đầu vào chi tiết thấp hơn được gọi là "các bản vá" và điều quan trọng cần lưu ý là chúng có thể không đại diện cho hình học thực tế cuối cùng sẽ tồn tại (mặc dù chúng có thể). Hãy suy nghĩ giống như các điểm kiểm soát của một đường cong bezier, ngoại trừ một bề mặt.

Trình tạo bóng vỏ lấy một bản vá đầu vào và tạo ra một bản vá đầu ra (hoặc các bản vá; đây là nơi thường xảy ra sự phân chia của bản vá). Siêu dữ liệu liên tục về bản vá cũng có thể được tính toán trong shader vỏ và đầu ra để xử lý bởi các giai đoạn sau của đường ống.

Đầu ra của shader vỏ tàu chạy qua giai đoạn tessname (chức năng cố định) tạo ra các miền được lát gạch, chuẩn hóa của loại thích hợp (ví dụ: hình tứ giác hoặc hình tam giác).

Trình tạo bóng miền được thực thi đối với các miền này để tính toán vị trí đỉnh thực tế của bất kỳ điểm đã cho nào trong một miền dẫn đến kết quả như đã nói ở trên. Do đó, shader miền do đó tạo ra một vị trí đỉnh.

Giai đoạn tessname xảy ra sau giai đoạn đổ bóng đỉnh trong đường ống.

Hình học Shader

Theo một cách nào đó, các shader hình học giống như các shader vỏ / miền đơn giản hóa. Họ chỉ đơn giản là lấy đỉnh đầu vào và tạo ra đỉnh đầu ra. Đối với một đỉnh đầu vào nhất định, nhiều đỉnh đầu ra có thể được tạo ra, vì vậy chúng có thể được sử dụng để "tạo hình học".

Giai đoạn shader hình học xảy ra sau shader đỉnh, và sau giai đoạn tessname.

Công dụng

Trình tạo bóng hình học có thể ghi vào bộ đệm đầu ra thay vì được đưa trực tiếp vào giai đoạn rasterization và phân đoạn mảnh của đường ống; điều này có nghĩa là bạn có thể chạy lại hình học được tạo ra bởi sự kết hợp của một shader đỉnh / hull / domain / hình học lặp lại qua đường ống, để thực hiện công việc bổ sung trong giai đoạn đổ bóng đỉnh khác hoặc bất cứ điều gì.

Những gì bạn có thể sử dụng những thứ này là một chủ đề khá rộng, không giới hạn hiệu quả, vì vậy tôi sẽ không thực sự cố gắng giải quyết vấn đề đó. Nhưng đối với một số lý do thúc đẩy để xem xét sử dụng chúng ... Điều quan trọng của các giai đoạn đổ bóng này là chúng cho phép bạn có được khá nhiều chi tiết bổ sung mà không phải trả chi phí bộ nhớ hoặc băng thông cho tất cả thời gian. Và cũng để di chuyển xử lý từ CPU sang GPU.

Địa hình là một ví dụ điển hình về nơi bạn có thể muốn sử dụng một số công nghệ này, vì bạn thường cần nhìn thấy nó rất gần (vì nhân vật của bạn đang đứng trên đó) và rất xa (những ngọn núi ở phía xa) và có thể để kiểm soát vị trí và mức độ chi tiết bạn đưa vào hình học địa hình "đang bay" thông qua các giai đoạn đổ bóng này là rất mạnh mẽ. Các giải pháp thay thế trước đây luôn phải trả chi phí trung bình không đổi cho địa hình (cách tiếp cận mẫu số chung thấp nhất) hoặc phân chia khối hình học bằng tay cho các mức độ chi tiết khác nhau trong và ngoài bộ nhớ GPU, rất tẻ nhạt và đắt.

Bất kỳ tình huống tương tự nào mà bạn có thể có một phạm vi mức độ chi tiết thực sự rộng, bạn cần hỗ trợ cho một số lưới hoặc mô hình có thể phân chia hợp lý cũng có thể là một ứng cử viên để làm điều gì đó thông minh với các shader này. Mặc dù vậy, không phải tất cả mọi thứ đều chuyển thành tối ưu hóa kiểu bề mặt phân khu . Bạn có thể có thể sử dụng chúng cho vải và tóc là tốt.

Để đọc thêm, bao gồm nhiều chi tiết hơn tôi có thể nhớ hoặc đi sâu vào đây:


4
Hãy nhớ rằng các shader vỏ và miền yêu cầu phần cứng Direct3D Feature 11.0 trở lên và các shader hình học yêu cầu phần cứng Direct3D Feature Level 10.0 trở lên. Ngoài ra, hầu hết các thiết kế card màn hình cung cấp cho giai đoạn shader hình học rất ít hoặc không có phần cứng chuyên dụng, vì vậy tiện ích của chúng trong thực tế ít hơn nhiều so với dự kiến ​​ban đầu.
Chuck Walbourn

@ChuckWalbourn: Tôi thực sự muốn nghe thêm, nếu bạn muốn, trong một câu trả lời riêng
Panda Pajama
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.