Różnica między materiałem a modułem cieniującym

27

W grach materiały często wpływają tylko na wygląd obiektów. Wygląd zewnętrzny jest realizowany przez shadery. Czy w związku z terminologią istnieje różnica między materiałami a modułami cieniującymi? Czy powinieneś napisać jeden moduł cieniujący dla jednego materiału?

danijar
źródło
1
Widziałem kilka silników, w których materiałem jest moduł cieniujący + rozproszona tekstura + mapa uderzeniowa, ale nie sądzę, że istnieje jedna zwięzła definicja.
Roy T.
3
@RoyT. Silniki te niewłaściwie stosowałyby terminologię. Materiał nie jest równoznaczne z shader - moduł cieniujący jest programem , wykorzystując materiał jest kilka wartości danych. 2 różne programy cieniujące mogą renderować ten sam materiał i uzyskiwać różne wyniki.
bobobobo,
@ bobobobo Lub częściej jeden moduł cieniujący byłby używany do renderowania wielu materiałów, poprzez podłączanie różnych tekstur, wartości parametrów i tym podobnych.
Nathan Reed,

Odpowiedzi:

29

Materiał to kombinacja atrybutów opisujących, jak powinna wyglądać powierzchnia danego materiału.

Niektóre silniki używają różnych shaderów dla różnych materiałów, w którym to przypadku definicja materiału może wyglądać następująco:

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

Inne silniki używają jednego modułu cieniującego dla wszystkich obiektów (a raczej silniki decydują o tym, który moduł cieniujący należy użyć w zależności od parametrów, możliwości GPU i innych czynników, takich jak odległość), w którym to przypadku materiał wyglądałby bardziej tak:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
API-Beast
źródło
2
czy nie można rozszerzyć definicji materiału na wszystkie zmysły obsługiwane przez silnik gry? Na przykład dźwięki, które materiał wyda po uderzeniu, nadepnięciu itp., Lub jego parametry tarcia?
didierc
10

A materialne określa sposób obiekt reaguje na światło.

Istnieje kilka typowych parametrów:

  • Kd: Rozproszona reakcja na światło
  • Ks: Specjalna reakcja na światło
  • Ns: „Shininess”
  • map_Kd: Texture

Teraz powiedz, że masz trójkąt renderowany za pomocą materiału M. Mma Kd = (1,0,0) (czerwona odpowiedź rozproszona), Ks = (1,1,1) (biała reakcja zwierciadlana), Ns = 25 (wyróżnienie zwierciadlane będzie dość ostre i nie rozmywane) i nie ma map_Kd ( bez tekstury).

Zadaniem modułu cieniującego jest użycie matematyki do ustalenia pozycji wierzchołka trójkąta , położenia światła, wartości koloru materiału i określenia, jaki kolor powinien mieć trójkąt. Moduł cieniujący wierzchołek wykonuje to „obliczenia cieniowania” jeden raz dla każdego wierzchołka i interpoluje kolor w trójkącie.

Częstą operacją w module cieniującym do obliczania odpowiedzi rozproszonej w wierzchołku jest:

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

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;
Bobobobo
źródło
3

Materiał jest tym, co stosuje się do geometrii, aby nadać jej kolor i wzór. Tekstura jest składnikiem materiału.

Moduł cieniujący to mały program, który umożliwia renderowanie tego materiału w czasie wykonywania. Zaletą shaderów jest to, że możesz zrobić wszystko, od zwykłego renderowania materiału, poprzez dodawanie dynamicznych efektów, takich jak odblaski i odbicia aż po niezwykle sprytne rzeczy, takie jak renderowanie fałszywych dziur przez ściany, w które trafiła kula.

więc w odpowiedzi na twoje pytanie - tak, jest różnica, istnieje również pewne nakładanie się - możesz albo zrobić czerwony materiał lub napisać moduł cieniujący, aby renderować rzeczy jako czerwone, ale oba pozwalają ci na wiele rzeczy, które możesz nie mógł z drugim.

i nie, nie potrzebujesz jednego modułu cieniującego na materiał. chociaż materiał wymaga renderowania modułu cieniującego, możesz mieć go dla wszystkich materiałów, jeśli chcesz. robią określone rzeczy, więc jeśli na przykład chcesz, aby wszystko było lśniące, możesz po prostu napisać jedną.

Dobrym przykładem shaderów jest sprzęt wojenny. istnieje jeden zestaw materiałów do sceny, ale gdy naciśniesz przycisk, aby przejść do widoku taktycznego, moduły cieniujące, które renderują te materiały, zmieniają się, aby wyglądały na zarysowane i ogólnie inne. To samo dzieje się w Batmanie: „tryb detektywa” arkhama.

SirYakalot
źródło
1
Technicznie tekstura nie jest to materiał na swój własny, to zwykle część materiału.
bobobobo,
1

Chociaż jest późno, istnieje „oszustwo”, które może pomóc Ci lepiej zrozumieć.

Materiał to wszystko, co jest dołączone do określonego modułu cieniującego dla tego wywołania losowania.

Na przykład w powyższej odpowiedzi masz następujący materiał: [Materiał] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

co tłumaczy, że będziesz renderować za pomocą modułu cieniującego, który wykonuje normalną mapę i obliczenia zwierciadlane, i użyje 3 tekstur wewnątrz tego modułu cieniującego.

Później możesz ponownie użyć tego samego modułu cieniującego, z różnymi innymi 3 teksturami (np. Car, carNormal i carSpecular), wykonasz inne wywołanie losowania z innym materiałem, tylko dlatego, że zmieniłeś parametry modułu cieniującego.

Podsumowując, materiał to wszystko, co jednoznacznie tworzy wywołanie losowania przy użyciu tego samego modułu cieniującego o tych samych parametrach (tekstury, mundury, atrybuty).

Mam nadzieję, że to pomoże lepiej to zwizualizować

użytkownik1288789
źródło
czy to coś takiego: moduł cieniujący jest klasą, ale materiał jest instancją?
Bengalaa