Tôi nên sử dụng bao nhiêu shader hoạt động tại một khung hình trong trò chơi? 5 hoặc nhiều hơn 100?


20

Có bao nhiêu shader thường hoạt động, cùng một lúc trong một cảnh, trong các trò chơi hiện đại? Tôi biết rằng nhiều shader đang được sử dụng, với các trò chơi chuyển đổi giữa chúng trong mỗi khung hình và việc vẽ các đối tượng thông qua shader là điều phổ biến:

  1. Vẽ tất cả các đối tượng với một shader một
  2. Thay đổi từ shader một thành shader hai
  3. Vẽ tất cả các đối tượng với shader hai

Tuy nhiên, tôi biết nó không đơn giản, đặc biệt là với các hiệu ứng như hiệu ứng phát sáng cho toàn cảnh, kết xuất thành kết cấu, v.v., nhưng tôi đoán chúng ta có thể cho rằng nó hoạt động theo cách đó hầu hết thời gian, phải không? Cách tiếp cận "nhóm theo shader" là tốt, bởi vì chuyển đổi shader là một hoạt động tốn kém.

Từ một phía, bạn không thể có quá nhiều shader, vì bạn muốn kết xuất cảnh nhanh. Mặt khác, bạn cần nhiều shader khác nhau (hoặc uber-shader với các nhánh - khá giống nhau) cho da, kim loại, nước, v.v.

Có bao nhiêu (và cái) shader khác nhau mà trò chơi thám tử 3D lý thuyết, hiện đại, người thứ ba, 3D cho PC (DirectX 11, nếu có vấn đề) sử dụng? Nó sẽ là 5, 20 hoặc nhiều hơn như 100 shader hoạt động, chỉ tính hoạt động, tại một số "khung X"? Tôi biết đó không phải là một con số, nhưng tôi tự hỏi quy mô và các yếu tố nào là quan trọng, khi xem xét cho một trò chơi trên PC.


Trong trò chơi mẫu của tôi, tôi sẽ sử dụng khoảng 9-11 cho mỗi khung hình (tính nó là các shader nhỏ khác nhau hoặc một uber-shader - không quan trọng bây giờ):

  1. Da bóng
  2. Shader mắt (không quá nhiều? Nhưng chúng khác nhau)
  3. Kim loại shader
  4. Shader mặt đất
  5. Shader tuyết / mưa (nếu cần)
  6. Shader nước (nếu nước tồn tại trong cảnh)
  7. Glow shader (chỉ khi có một số hiệu ứng đặc biệt)
  8. Shader ánh sáng emiter (đèn đường, vv)
  9. Shader tiêu chuẩn (đối với tất cả các loại khác, chỉ cần tạo bóng tiêu chuẩn)
  10. Shader chuẩn với bản đồ bình thường
  11. Trình tạo bóng 2D (cho GUI, v.v.)

Là "nhiều" hay "không nhiều"? Tôi đã quên một số shader quan trọng mà tôi sẽ cần?

Câu trả lời:


28

Nó thực sự phụ thuộc vào kỹ thuật. Trong một kết xuất phía trước, bạn thường có một shader cho mỗi loại vật liệu khác nhau. Trong các trò chơi AAA sử dụng kỹ thuật này, các shader thường được tạo từ một tập hợp các tùy chọn trên vật liệu mà một nghệ sĩ có thể đặt. Điều này có thể dẫn đến hàng trăm shader (1). Nhưng nói chung, số lượng shader là theo thứ tự 40

Trong một shading / render hoãn lại, bạn thường mã hóa loại vật liệu trong bộ đệm G và sau đó sử dụng một shader lớn để kết xuất chính xác các loại vật liệu khác nhau theo cách khác nhau. Điều này dẫn đến ít hơn rất nhiều, nhưng phức tạp hơn, shader. Hãy nói rằng số lượng shader ở đây là theo thứ tự 5.

(1) Nguồn: Tôi đã làm việc cho một nhà thầu của Crystal Dynamics, nơi tôi đã xây dựng một công cụ để giảm số lượng shader được tạo cho Tomb Raider kể từ khi thế hệ tự động thoát khỏi tầm tay;). Mục đích là để giảm số lượng shader xuống mức 40 hoặc tương tự.


2
Cảm ơn câu trả lời của bạn - nó khá phức tạp và phong phú. Tôi vừa mới bình chọn nó. Tuy nhiên, tôi sẽ đợi vài ngày trước khi đánh dấu, bởi vì đây là một câu hỏi "mở" - có lẽ ai đó sẽ có thêm điều gì đó để thêm vào từ kinh nghiệm của chính họ. Một lần nữa, cảm ơn Roy :)
PolGpson

s / less / less / ...
lỗi

3

Tôi biết bạn muốn có một câu trả lời cho PC. Nhưng tôi sẽ trả lời cho những gì tôi làm trong iOS và tôi không mong đợi nhận được dấu của bạn.

Có vẻ như bạn có ý tưởng đúng. Nó sẽ khác nhau cho mỗi ứng dụng mặc dù. Cuối cùng, tất cả chỉ là làm những gì cần thiết để có được tốc độ khung hình mong muốn của bạn. Trên iPhone, tỷ lệ mục tiêu của tôi là 60. Tôi không muốn nó xuống dưới 30. Khi tôi có một vụ nổ với hàng trăm hạt dựa trên sprite hoạt hình, nó giảm xuống còn 30 trên iphone5 và thấp hơn nhiều so với 4. Vì vậy Tôi phải đưa ra quyết định về việc giảm độ phức tạp trên một số thiết bị. Và đôi khi quyết định đó ảnh hưởng đến shader.

Nhưng nó thường không ảnh hưởng đến bao nhiêu shader mà là tôi sử dụng shader nào cho một nhiệm vụ dựa trên mục tiêu tốc độ khung hình của tôi.

Theo ý kiến ​​của tôi, các shader khi được sử dụng sẽ làm tăng tốc độ khung hình một cách chính xác. Tôi có một ứng dụng có 80 shader, nhưng nó không sử dụng tất cả chúng trên một khung hình - có lẽ khoảng 10. Và nó biên dịch chúng khi cần và loại bỏ tất cả chúng giữa các cảnh. Và trên phần cứng của tôi, tôi đã không thấy tốc độ khung hình hiệu ứng đếm bóng. Chỉ có các kỹ thuật được sử dụng trong shader. Nhưng chắc chắn tôi nghĩ rằng sử dụng 2 shader tương tự sẽ tốt hơn cho tốc độ khung hình hơn là một cái phức tạp hơn mà phân nhánh.

Tôi cũng có các shader làm giảm chất lượng nếu kết xuất chậm hoặc trên thiết bị chậm hơn. Tôi sử dụng ánh xạ bình thường trên iPhone 5 nhưng trao đổi shader thành ánh xạ không thực hiện ánh xạ bình thường trên iPhone 4.

Tôi thích câu trả lời của Roy và tôi luôn cố gắng hiểu rõ hơn về những trò chơi "thực sự" được tạo ra như thế nào. Vì tôi tự học nên tôi không bao giờ biết liệu khám phá tuyệt vời của tôi trong ngày chỉ là cách nó thường được thực hiện hay vẫn còn chậm một vài bước so với các chuyên gia thực sự.


1
Không có vấn đề với thực tế là câu trả lời của bạn "dành cho iOS". Tôi đã nói về PC chủ yếu vì tôi muốn tránh "nó phụ thuộc vào nền tảng" trả lời ngắn gọn;) Có thể câu trả lời của bạn không phải là 100% đối với tôi. Tuy nhiên, nó vẫn có một số kết luận độc lập với nền tảng nên tôi thấy nó tốt. Và các thành viên khác trong cộng đồng (sử dụng iOS) có thể thấy nó hữu ích hơn nữa, vì vậy hãy cảm ơn và bỏ phiếu từ tôi :)
PolGpson

1

Bạn thực sự không thể đưa ra con số về số lượng shader bạn nên hoặc không nên có, vì nó phụ thuộc vào các yếu tố giới hạn của trò chơi của bạn, cũng như nền tảng mục tiêu. Trong thực tế, nên giảm số lượng shader hoạt động thành "chỉ nhiều như bạn thực sự cần". Đôi khi điều này có nghĩa là bạn chỉ có một số ít shader (10 hoặc hơn) cùng một lúc, và đôi khi nó có nghĩa là bạn có vài chục.

Một cách để giúp hạn chế lượng hoán vị xuất hiện trong trò chơi của bạn là thực hiện kỹ thuật "ubershader", trong đó hầu hết mọi shader đều có nguồn gốc từ một shader đơn lẻ, và sự khác biệt và hành vi đặc biệt được hoán đổi thông qua bộ xử lý trước. Tất nhiên, có những trường hợp ngoại lệ cho các hiệu ứng đặc biệt như độ sâu trường ảnh, tắc xung quanh, v.v.

Trải nghiệm của tôi với các trò chơi AAA cho đến thời điểm này đã chỉ ra rằng một vài chục shader hoạt động không phải là không có lý.

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.