Sự khác biệt giữa Vật liệu và Shader


27

Trong các trò chơi, vật liệu thường chỉ ảnh hưởng đến sự xuất hiện trực quan của các vật thể. Sự xuất hiện trực quan được thực hiện bởi các shader. Vì vậy, liên quan đến thuật ngữ có sự khác biệt giữa vật liệu và shader? Bạn có nên viết một shader cho một tài liệu?


1
Tôi đã thấy một vài động cơ trong đó một vật liệu là một shader + kết cấu khuếch tán + vết sưng, nhưng tôi không nghĩ có một định nghĩa ngắn gọn.
Roy T.

3
@RoyT. Những động cơ sẽ được sử dụng thuật ngữ sai. Một vật liệu không tương đương với một shader - shader là một chương trình , một vật liệu là một loạt các giá trị dữ liệu. 2 chương trình đổ bóng khác nhau có thể kết xuất cùng một vật liệu và nhận được kết quả khác nhau.
bobobobo

@bobobobo Hoặc thông thường hơn, một shader đơn sẽ được sử dụng để kết xuất nhiều vật liệu, bằng cách cắm vào các kết cấu khác nhau, các giá trị tham số, v.v.
Nathan Reed

Câu trả lời:


29

Một vật liệu là sự kết hợp của các thuộc tính mô tả bề mặt của vật liệu đã cho sẽ trông như thế nào.

Một số động cơ sử dụng các shader khác nhau cho các vật liệu khác nhau, trong trường hợp đó, một định nghĩa vật liệu có thể trông như thế này:

[Material]
Shader=NormalMappedSpecular.glsl
Texture1=Rock.png
Texture2=RockNormal.png
Texture3=RockSpecular.png

Các động cơ khác sử dụng một shader cho tất cả các đối tượng (hay đúng hơn là các động cơ quyết định sử dụng shader nào phụ thuộc vào các tham số, khả năng của GPU và các yếu tố khác như khoảng cách), trong trường hợp đó, một vật liệu sẽ giống như thế này:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png

2
không ai có thể mở rộng định nghĩa của một vật liệu đến mọi giác quan được hỗ trợ bởi công cụ trò chơi? Chẳng hạn, âm thanh mà vật liệu sẽ tạo ra khi va vào, bước lên, v.v., hay các thông số ma sát của nó?
didierc

10

Một vật liệu xác định cách một vật thể phản ứng với ánh sáng.

Có một vài thông số chung:

  • Kd: Phản ứng khuếch tán với ánh sáng
  • Ks: Phản ứng đặc biệt với ánh sáng
  • Ns: "Shininess"
  • map_Kd: Hoạ tiết

Bây giờ nói rằng bạn có một hình tam giác được kết xuất với vật liệu M. Mcó Kd = (1,0,0) (phản hồi khuếch tán màu đỏ), Ks = (1,1,1) (phản ứng cơ bản màu trắng), Ns = 25 (tô sáng đặc trưng sẽ khá sắc nét và không bị mờ) và không có map_Kd ( không có kết cấu).

Công việc của shader là sử dụng toán học để lấy các vị trí đỉnh của tam giác , vị trí của ánh sáng, các giá trị màu vật liệu và tìm ra màu sắc của hình tam giác sẽ xuất hiện. Một shader đỉnh thực hiện "tính toán tô bóng" này một lần tại mỗi đỉnh và nội suy màu trên tam giác.

Một hoạt động phổ biến trong một shader để tính toán phản ứng khuếch tán ở một đỉnh là:

// hlsl
float3 vertexToLight = normalize( lightPos.xyz - vertexPos.xyz ) ;

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;

3

Một vật liệu là những gì bạn áp dụng cho hình học để cung cấp cho nó một màu sắc và hoa văn. Một kết cấu là một thành phần của một vật liệu.

Shader là một chương trình nhỏ cho phép hiển thị tài liệu này khi chạy. Điều hay ho của shader là bạn có thể làm mọi thứ, từ chỉ đơn giản là hiển thị vật liệu, cho đến thêm các hiệu ứng động như các điểm nổi bật và phản xạ cho đến những thứ cực kỳ thông minh như tạo ra các lỗ giả xuyên qua tường nơi một viên đạn đã bắn trúng.

Vì vậy, trong câu trả lời cho câu hỏi của bạn - vâng, có một sự khác biệt, cũng có một chút trùng lặp - bạn có thể tạo một vật liệu màu đỏ hoặc viết một shader để làm cho mọi thứ có màu đỏ, nhưng cả hai cũng cho phép bạn làm được nhiều thứ không thể với người khác.

và không, bạn không cần một shader cho mỗi vật liệu. mặc dù một tài liệu yêu cầu một shader được hiển thị, bạn có thể có một tài liệu cho tất cả các tài liệu nếu bạn muốn. họ làm những việc cụ thể vì vậy nếu bạn muốn mọi thứ trở nên sáng bóng chẳng hạn, bạn chỉ cần viết một cái.

Một ví dụ hay về shader là trong các bánh răng chiến tranh. có một bộ tài liệu cho cảnh, nhưng khi bạn nhấn nút để chuyển sang chế độ xem chiến thuật, các shader đang hiển thị các tài liệu này sẽ thay đổi để mọi thứ trông có vẻ khác biệt và nhìn chung khác nhau. Điều tương tự cũng xảy ra ở người dơi: 'chế độ thám tử' của arkham.


1
Về mặt kỹ thuật, một kết cấu không thực sự là một vật liệu của riêng nó, nó thường là một phần của vật liệu.
bobobobo

1

Mặc dù muộn, nhưng có một "cheat" có thể giúp bạn hiểu rõ hơn.

Một vật liệu là tất cả mọi thứ được gắn vào một shader nhất định cho lệnh gọi đó.

Ví dụ: trong câu trả lời ở trên, bạn có tài liệu này: [Chất liệu] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockN normal.png Texture3 = RockSpecular.png

trong đó dịch rằng bạn sẽ được kết xuất với một shader có bản đồ bình thường và tính toán cụ thể, và nó sẽ sử dụng 3 kết cấu bên trong shader đó.

Sau này, bạn có thể sử dụng lại cùng một shader, với 3 kết cấu khác nhau (như car, carN normal và carSpecular), bạn sẽ thực hiện một lệnh gọi khác với một vật liệu khác, chỉ vì bạn đã thay đổi các tham số của shader.

Nói chung, một vật liệu là tất cả mọi thứ tạo ra một lệnh gọi sử dụng cùng một shader với cùng các tham số (kết cấu, đồng phục, thuộc tính).

Tôi hy vọng điều này sẽ giúp hình dung rõ hơn về nó


nó có phải là một cái gì đó như: shader là lớp, nhưng vật liệu là ví dụ?
Bengalaa
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.