Differenza tra materiale e shader


27

Nei giochi, i materiali spesso influenzano solo l'aspetto visivo degli oggetti. L'aspetto visivo è influenzato dagli shader. Quindi per quanto riguarda la terminologia c'è una differenza tra materiali e shader? Dovresti scrivere uno shader per un materiale?


1
Ho visto alcuni motori in cui un materiale è uno shader + texture diffusa + bumpmap, ma non credo che ci sia una definizione concisa.
Roy T.

3
@RoyT. Quei motori avrebbero usato una terminologia impropria. Un materiale non equivale a uno shader : uno shader è un programma , un materiale è un insieme di valori di dati. 2 diversi programmi shader possono rendere lo stesso materiale e ottenere risultati diversi.
Bobobobo,

@bobobobo O più comunemente, un singolo shader verrebbe utilizzato per il rendering di molti materiali, inserendo trame diverse, valori dei parametri e simili.
Nathan Reed,

Risposte:


29

Un materiale è una combinazione di attributi che descrivono l'aspetto di una superficie del materiale dato.

Alcuni motori utilizzano shader diversi per materiali diversi, nel qual caso una definizione di materiale potrebbe apparire così:

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

Altri motori usano uno shader per tutti gli oggetti (o meglio i motori decidono quale shader utilizzare in base ai parametri, alle capacità della GPU e ad altri fattori come la distanza), nel qual caso un materiale sarebbe più simile a questo:

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

2
non si potrebbe estendere la definizione di un materiale a tutti i sensi supportati dal motore di gioco? Ad esempio, i suoni che il materiale produrrà quando viene colpito, calpestato, ecc. O i suoi parametri di attrito?
Didierc,

10

Un materiale specifica come un oggetto risponde alla luce.

Ci sono un paio di parametri comuni:

  • Kd: risposta diffusa alla luce
  • Ks: risposta speculare alla luce
  • Ns: "Shininess"
  • map_Kd: Texture

Ora supponiamo che tu abbia un triangolo reso con materiale M. Mha Kd = (1,0,0) (risposta diffusa rossa), Ks = (1,1,1) (risposta speculare bianca), Ns = 25 (l'evidenziazione speculare sarà abbastanza nitida e non sfocata) e nessuna map_Kd ( nessuna trama).

Il compito dello shader è usare la matematica per prendere le posizioni dei vertici del triangolo , la posizione della luce, i valori di colore del materiale e capire di che colore dovrebbe apparire il triangolo. Uno shader di vertice esegue questo "calcolo dell'ombreggiatura" una volta per ciascun vertice e interpola il colore attraverso il triangolo.

Un'operazione comune in uno shader per calcolare la risposta diffusa a un vertice è:

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

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

3

Un materiale è ciò che si applica alla geometria per dargli un colore e un motivo. Una trama è un componente di un materiale.

Uno shader è un piccolo programma che consente di rendere questo materiale in fase di esecuzione. La cosa bella degli shader è che puoi fare tutto dal semplice rendering del materiale, all'aggiunta di effetti dinamici come luci e riflessi speculari fino a cose estremamente intelligenti come il rendering di falsi buchi attraverso i muri in cui un proiettile ha colpito.

quindi in risposta alla tua domanda - sì, c'è una differenza, c'è anche un po 'di sovrapposizione - potresti creare un materiale rosso o scrivere uno shader per rendere le cose come rosse, ma entrambe ti permettono anche molte cose non poteva con l'altro.

e no, non hai bisogno di uno shader per materiale. sebbene un materiale richieda il rendering di uno shader, puoi averne uno per tutti i materiali se lo desideri. fanno cose specifiche, quindi se vuoi che tutto sia lucido, per esempio, puoi semplicemente scriverne uno.

Un bell'esempio di shader è negli ingranaggi della guerra. c'è un set di materiali per la scena, ma quando si preme un pulsante per passare alla vista tattica, gli shader che stanno rendendo questi materiali cambiano in modo che le cose appaiano delineate e generalmente diverse. La stessa cosa accade in Batman: la "modalità detective" di Arkham.


1
Tecnicamente una trama non è in realtà un materiale a sé stante, di solito fa parte di un materiale.
Bobobobo,

1

Anche se in ritardo, c'è un "cheat" che può aiutarti a capire meglio.

Un materiale è tutto ciò che è collegato a un determinato shader per quel richiamo.

Ad esempio, nella risposta sopra, hai questo materiale: [Materiale] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

che ha tradotto che si renderizzerà con uno shader che esegue una normale mappa e un calcolo speculare, e utilizzerà le 3 trame all'interno di quello shader.

In seguito, puoi riutilizzare lo stesso shader, con altre 3 trame diverse (come car, carNormal e carSpecular), eseguirai una chiamata di disegno diversa con un materiale diverso, solo perché hai modificato i parametri dello shader.

Tutto sommato, un materiale è tutto ciò che crea in modo univoco una chiamata di disegno usando lo stesso shader con gli stessi parametri (trame, uniformi, attributi).

Spero che questo aiuti a visualizzarlo meglio


è qualcosa del tipo: lo shader è la classe, ma il materiale è l'istanza?
Bengalaa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.